it-roy-ru.com

Капибара - отправить форму без кнопки

Я пытаюсь отправить форму без кнопки, используя только Capybara и Rspec (без Cucumber или Selenium, я знаю, что уже есть вопрос по этому поводу).

Я видел, что есть Gist для добавления метода для отправки формы без кнопки: 

module SubmitRackTestFormWithoutButton
  def submit_form!
    Capybara::RackTest::Form.new(driver, form).submit({})
  end
end
Capybara::RackTest::Node.send :include, SubmitRackTestFormWithoutButton

https://Gist.github.com/989533 , но я не получил его на работу, и я оставил комментарий к нему:

Я получаю неопределенный метод submit_form! для #Capybara :: Node :: Элемент: ... на самом деле с помощью «Capybara :: RackTest :: Node.send: include, SubmitRackTestFormWithoutButton» метод submit_form! добавлен в Узел (не к Элементу), но найти возвращаемый Элемент

Есть ли у вас идея поработать над этим Gist или каким-либо другим решением отправить форму без кнопки?

Спасибо

23
Alessandro DS

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

Нет никаких причин не иметь кнопку в форме, это плохая доступность, чтобы не иметь форму, и пользователи, которые не имеют GUI или используют программы чтения с экрана, будут иметь проблемы с отправкой формы в противном случае.

Если вы не хотите, чтобы кнопка формы была видимой, могу ли я предложить использовать CSS, чтобы скрыть ее:

<input type="submit" style="position: absolute; left: -9999px; width: 1px; height: 1px;">
3
Mario Visic

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

Попробуйте сделать это вместо этого:

page.execute_script("$('form#your-form').submit()")
22
Marcelo Eden

Вот простое решение, которое не требует capybary-webkit, qt, lmnop или чего-либо еще.

Не требует кнопку отправки. Люди говорят, что это нужно, но что угодно.

Просто обезьяна поймать класс или два

# /spec/support/capybara.rb
  class Capybara::Session
    def submit(element)
      Capybara::RackTest::Form.new(driver, element.native).submit({})
    end
  end

Тогда вы можете сделать что-то вроде

require 'support/capybara'

before do
  create :lead
  create :user, :different_email
end

it 'Searchable' do
  visit users_path
  page.should have_content 'Slicer'
  page.should have_content 'Dicer'

  fill_in 'Search', with: 'dice'

  form = find '#search-form' # find the form
  page.submit form           # use the new .submit method, pass form as the argument

  page.should have_content 'Dicer'
  page.should_not have_content 'Slicer'
end

Это что-то вроде ответа jacob здесь, но для него вы должны определить это в середине теста.

Для этого решения вы можете определить это в каком-то файле в каталоге/support или в начале этой спецификации и т.д. Это уменьшает беспорядок в тесте.

8
Cruz Nunez

Вы можете сделать это, нажав ввод внутри ввода

find('form input').native.send_keys :enter
3
Rob Fox

Я получил это для работы в капибаре 1.1.2 с:

  form = page.find("form")
  class << form
    def submit!
      Capybara::RackTest::Form.new(driver, native).submit({})
    end
  end
  form.submit!

и похоже, что подобное решение описано здесь: http://minimul.com/submitting-a-form-without-a-button-using-capybara.html

3
jacob

Теперь вы должны использовать click_on

click_on 'Sign up'
1