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

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

  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"

Проблема в том, что у меня нет кнопки «ОК» в форме. Мне нужен способ выполнить «form.submit», не нажимая ни одной кнопки или ссылки - так же, как это происходит, когда вы нажимаете ENTER. когда вы находитесь в поле формы с помощью браузера.

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


person Daniel Cukier    schedule 09.05.2010    source источник


Ответы (12)


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

 find_field('field2').native.send_key(:enter)
person Brian Dunn    schedule 29.03.2011
comment
Имейте в виду, что, по крайней мере, для меня с полтергейстом в качестве драйвера вы должны использовать :Enter - person PragTob; 03.02.2016

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

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

У меня работал с capybara-envjs. Должен работать и с селеном.

person Hakan Ensari    schedule 27.06.2010
comment
Есть еще одно аналогичное решение: page.execute_script ($ ('form # your-form'). Submit ()) - - также ознакомьтесь с примечанием относительно Capybara :: Session # execute_script (он говорит, что execute_script следует использовать по возможности вместо evaluate_script) - это всего лишь часть информации, которую следует учитывать. - person user664833; 24.06.2014

Мне просто нужно было самому решить эту проблему. В webrat у меня было примерно так:

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

Я смог добиться того же с этим в Capybara:

  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
person siannopollo    schedule 25.06.2011
comment
Это круто, потому что для этого даже не требуется javascript! Так что это не должно зависеть от реализации драйвера (как и все остальное в мире ...). В частности, он вообще не работает без js. - person bchurchill; 13.05.2013

С драйвером 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
person Aaron Gibralter    schedule 19.10.2010

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

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

person jnicklas    schedule 09.05.2010
comment
проблема в том, что я НЕ МОГУ добавить кнопку, поскольку я тестирую веб-сайт, я не могу изменить исходный код. - person Daniel Cukier; 10.05.2010

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

Вот эмуляция javascript, сброшенная в Rails 3 для поддержки «ненавязчивого» (акцент на кавычках) Javascript. Линия

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

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

person Chubas    schedule 11.05.2010
comment
Я думаю, да. Я без проблем использую отправку формы с диалоговыми окнами подтверждения прямо сейчас в приложении, и они работают правильно. - person Chubas; 16.05.2010

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

person nakajima    schedule 18.10.2010

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

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

п. 307, Книга RSpec

person Sai Perchard    schedule 26.02.2011

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

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

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

find_field('field2').native.send_key("\n")
person vijay chouhan    schedule 11.02.2013

Это немного взломано, но восполняет потребность. Я исправил 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
person Patrick    schedule 03.11.2011

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

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