ruby-on-rails Capybara -提交不带按钮的表单

g6baxovj  于 2023-08-08  发布在  Ruby
关注(0)|答案(7)|浏览(162)

我试图提交一个没有按钮的表单,只使用水豚和Rspec(没有 cucumber 或 selenium ,我知道已经有一个问题)。
我看到有一个要点,添加一个方法来提交一个没有按钮的表单:

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!' for #Capybara::Node::Element:...实际上由“Capybara::RackTest::Node.send:include,SubmitRackTestFormWithoutButton”方法submit_form!被添加到节点(而不是元素),但find返回一个元素
你有没有一些想法来解决这个要点,或者其他一些解决方案来提交一个没有按钮的表单?
谢啦,谢啦

h7appiyu

h7appiyu1#

你所有的产品代码都应该是可测试的,所以如果你添加了一个只供测试使用的代码,那么测试就没有意义了。
试着这样做:

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

字符串

nhjlsmyf

nhjlsmyf2#

这里有一个简单的解决方案,不需要capybarywebkit、qt、lmnop或其他。
不需要提交按钮。人们说你需要它,但不管怎样。
只需要monkeypatch一两节课

# /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目录中的某个文件中定义这个,或者在该规范的开头等等。它减少了测试中的混乱。

cnh2zyt3

cnh2zyt33#

您可以通过在输入中按Enter键来完成此操作

find('form input').native.send_keys :enter

字符串

atmip9wb

atmip9wb4#

我在水豚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

vql8enpb

vql8enpb5#

尽管使用capybara可以实现您想要的目标,但更简单、更实用的解决方案是在表单上放置一个提交按钮。
没有理由在表单上没有按钮,没有表单是不好的可访问性,没有GUI或正在使用屏幕阅读器的用户将在提交表单时遇到麻烦。
如果你不希望表单按钮可见,我可以建议你使用一些CSS来隐藏它:

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

字符串

um6iljoc

um6iljoc6#

现在你应该使用click_on

click_on 'Sign up'

字符串

fhg3lkii

fhg3lkii7#

最好的解决方案是使用JS驱动测试(如前面提到的comment above):

page.execute_script(%q{document.querySelector("form[action='/admin/opt_outs']").submit()})

字符串

如果没有JS驱动程序:

事实上,每个表单都应该有一个按钮,如果按钮不应该出现在UI中,只需使用display: none隐藏它,然后改为click_button

find('form input[type=submit]', visible: false)

相关问题