Ответ 1
Вы можете получить доступ к методу selenium send_keys для вызова события возврата, например
find_field('field2').native.send_key(:enter)
У меня есть тест с использованием 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, чтобы отправить форму. Как я могу это сделать?
Вы можете получить доступ к методу selenium send_keys для вызова события возврата, например
find_field('field2').native.send_key(:enter)
Простое решение:
When /^I submit the form$/ do
page.evaluate_script("document.forms[0].submit()")
end
Работал для меня с capybara-envjs. Следует также работать с селеном.
Мне просто пришлось решить эту проблему самостоятельно. В 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
С драйвером 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
Проще говоря: вы не можете.
Некоторые браузеры не позволят вам отправить форму без кнопки отправки вообще (в первую очередь Internet Explorer <= 6). Так что эта форма - плохая идея для начала. Добавьте кнопку отправки и поместите ее с экрана с помощью CSS.
Вероятно, вы можете выполнить свой собственный шаг (и, например, отправлю форму со ссылкой "Хорошо" ) и эмулировать функцию отправки.
Здесь приведена эмуляция javascript в Rails 3 для поддержки "ненавязчивого" (акцент на кавычки) Javascript. Строка
Capybara::Driver::RackTest::Form.new(driver, js_form(self[:href], emulated_method)).submit(self)
вероятно, является ключом к ответу на вашу проблему. Полный код здесь
Я бы рекомендовал вам добавить кнопку отправки, а затем скрыть ее с помощью CSS. Затем вы можете протестировать отправку формы, но все равно получите нужное поведение пользователя.
С Webrat вы можете просто:
When /^I submit the form$/ do
submit_form "form_id"
end
р. 307, Книга RSpec
Дисплей: ни одно решение не работает с capybara, используя драйвер selenium, потому что селен жалуется на взаимодействие с невидимыми элементами. Если вы попробуете вышеуказанное решение, вы можете увидеть следующее сообщение об ошибке:
Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotVisibleError)
Вы можете попробовать отправить новую строку:
find_field('field2').native.send_key("\n")
Это немного хакерское, но оно наполнило необходимость. Я обезглавил 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
Попробуйте это.
find(:css, "input[name$='login']").native.send_keys :enter