Подтвердить что ты не робот

Огурцы, капибара и селен - Отправка формы без кнопки

У меня есть тест с использованием Cucumber, capybara и selenium driver. Этот тест должен перейти к форме и представить ее. Обычный текст будет

  Scenario: Fill form
    Given I am on the Form page
    When I fill in "field1" with "value1"
    And I fill in "field2" with "value2"
    And I press "OK"
    Then I should see "Form submited"

Проблема в том, что У меня нет кнопки OK в форме Мне нужен способ сделать "form.submit" без нажатия любой кнопки или ссылки - то же самое, что и при нажатии клавиши ВВОД, когда вы находитесь в поле формы, используя браузер.

Я не знаю, как сказать capybara, чтобы отправить форму. Как я могу это сделать?

4b9b3361

Ответ 1

Вы можете получить доступ к методу selenium send_keys для вызова события возврата, например

 find_field('field2').native.send_key(:enter)

Ответ 2

Простое решение:

When /^I submit the form$/ do
  page.evaluate_script("document.forms[0].submit()")
end

Работал для меня с capybara-envjs. Следует также работать с селеном.

Ответ 3

Мне просто пришлось решить эту проблему самостоятельно. В webrat у меня было что-то вроде этого:

Then /^I submit the "([^\"]*)" form$/ do |form_id|
  submit_form form_id
end

Я смог достичь того же с этим в Капибаре:

  Then /^I submit the "([^\"]*)" form$/ do |form_id|
    element = find_by_id(form_id)
    Capybara::RackTest::Form.new(page.driver, element.native).submit :name => nil
  end

Ответ 4

С драйвером capybara Selenium вы можете сделать что-то вроде этого:

within(:xpath, "//form[@id='the_form']") do
  locate(:xpath, "//input[@name='the_input']").set(value)
  locate(:xpath, "//input[@name='the_input']").node.send_keys(:return)
end

Ответ 5

Проще говоря: вы не можете.

Некоторые браузеры не позволят вам отправить форму без кнопки отправки вообще (в первую очередь Internet Explorer <= 6). Так что эта форма - плохая идея для начала. Добавьте кнопку отправки и поместите ее с экрана с помощью CSS.

Ответ 6

Вероятно, вы можете выполнить свой собственный шаг (и, например, отправлю форму со ссылкой "Хорошо" ) и эмулировать функцию отправки.

Здесь приведена эмуляция javascript в Rails 3 для поддержки "ненавязчивого" (акцент на кавычки) Javascript. Строка

Capybara::Driver::RackTest::Form.new(driver, js_form(self[:href], emulated_method)).submit(self)

вероятно, является ключом к ответу на вашу проблему. Полный код здесь

Ответ 7

Я бы рекомендовал вам добавить кнопку отправки, а затем скрыть ее с помощью CSS. Затем вы можете протестировать отправку формы, но все равно получите нужное поведение пользователя.

Ответ 8

С Webrat вы можете просто:

When /^I submit the form$/ do
  submit_form "form_id"
end

р. 307, Книга RSpec

Ответ 9

Дисплей: ни одно решение не работает с capybara, используя драйвер selenium, потому что селен жалуется на взаимодействие с невидимыми элементами. Если вы попробуете вышеуказанное решение, вы можете увидеть следующее сообщение об ошибке:

Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotVisibleError)

Ответ 10

Вы можете попробовать отправить новую строку:

find_field('field2').native.send_key("\n")

Ответ 11

Это немного хакерское, но оно наполнило необходимость. Я обезглавил Capybara для поддержки метода #submit для элементов.

Он не является надежным, потому что он наивно создает параметры POST из всех атрибутов входных элементов name и value. (В моем случае все мои элементы <input> имели тип hidden, поэтому он отлично работает).

class Capybara::Node::Element
  # If self is a form element, submit the form by building a
  # parameters from all 'input' tags within this form.
  def submit
    raise "Can only submit form, not #{tag_name}" unless tag_name =~ /form/i

    method = self['method'].to_sym
    url = self['action']
    params = all(:css, 'input').reduce({}) do |acc, input|
      acc.store(input['name'], input['value'])
      acc
    end

    session.driver.submit(method, url, params)
  end
end

...

form = find('#my_form_with_no_submit_button')
form.submit

Ответ 12

Попробуйте это.

find(:css, "input[name$='login']").native.send_keys :enter