23

我有一个使用 Cucumber、capybara 和 selenium 驱动程序的测试。这个测试应该去一个表格并提交它。正常的文本是

  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 时发生的情况相同使用浏览器。

我不知道如何告诉水豚提交表格。我该怎么做?

4

12 回答 12

31

您可以访问 selenium send_keys方法来调用返回事件,例如

 find_field('field2').native.send_key(:enter)
于 2011-03-29T20:08:27.680 回答
19

一个简单的解决方案:

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

使用 capybara-envjs 为我工作。也应该与硒一起使用。

于 2010-06-27T01:22:54.550 回答
10

我只需要自己解决这个问题。在 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
于 2011-06-25T20:23:27.930 回答
5

使用 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
于 2010-10-19T22:38:03.770 回答
3

简单地说:你不能。

有些浏览器根本不允许您在没有提交按钮的情况下提交表单(最明显的是 Internet Explorer <= 6)。所以这种形式一开始是个坏主意。添加一个提交按钮并使用 CSS 将其放置在屏幕之外。

于 2010-05-09T15:27:09.047 回答
1

您可能会推出自己的步骤(例如,我使用“Ok”链接提交表单),并自己模拟提交功能。

这是 Rails 3 中删除的 javascript 仿真以支持“不显眼”(强调引号)Javascript。线

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

可能是回答您问题的线索。完整代码在这里

于 2010-05-11T04:49:35.347 回答
1

我建议你添加一个提交按钮,然后用 CSS 隐藏它。然后你可以测试表单提交,但仍然得到你想要的用户行为。

于 2010-10-18T17:22:20.640 回答
1

使用 Webrat,您可以:

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

页。307,RSpec 书

于 2011-02-26T02:28:21.367 回答
1

display:none 解决方案不适用于使用 selenium 驱动程序的 capybara,因为 selenium 抱怨与不可见元素交互。如果您尝试上述解决方案,您最终可能会看到以下错误消息:

Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotVisibleError)
于 2012-02-09T18:41:33.800 回答
1

您可以尝试发送换行符:

find_field('field2').native.send_key("\n")
于 2013-02-11T07:47:29.690 回答
0

这有点骇人听闻,但它满足了需求。我对 Capybara 进行了猴子补丁以支持#submit元素上的方法。

它并不健壮,因为它天真地从每个输入元素namevalue属性创建 POST 参数。(在我的情况下,我所有的<input>元素都是 type 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
于 2011-11-03T17:33:49.237 回答
0

试试这个..

find(:css, "input[name$='login']").native.send_keys :enter
于 2014-08-25T07:24:56.547 回答