代码之家  ›  专栏  ›  技术社区  ›  Daniel Cukier

黄瓜、水飞蓟和硒-提交不带按钮的表格

  •  23
  • Daniel Cukier  · 技术社区  · 16 年前

    我用黄瓜、水飞蓟和硒驱动力做了一个测试。此测试应转到表单并提交。正常文本为

      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时一样。

    我不知道怎么让卡帕拉提交一份表格。我该怎么做?

    12 回复  |  直到 16 年前
        1
  •  31
  •   Brian Dunn    15 年前

    你可以得到硒 send_keys 调用返回事件的方法,如

     find_field('field2').native.send_key(:enter)
    
        2
  •  19
  •   Hakan Ensari    16 年前

    一个简单的解决方案:

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

    为我和凯帕拉·恩维斯一起工作。也应该和硒一起工作。

        3
  •  10
  •   siannopollo    15 年前

    我只能自己解决这个问题。在韦布拉特,我有这样的经历:

    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
    
        4
  •  5
  •   Aaron Gibralter    15 年前

    使用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
    
        5
  •  3
  •   jnicklas    16 年前

    简单地说:你不能。

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

        6
  •  1
  •   Chubas    16 年前

    您可能会滚动自己的步骤(例如,我提交带有链接“OK”的表单),并自己模拟提交功能。

    这里是Rails3中的javascript仿真,它支持“不引人注目”(强调引号)的javascript。这条线

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

    可能是回答你问题的线索。完整代码是 here

        7
  •  1
  •   nakajima    15 年前

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

        8
  •  1
  •   Sai Perchard    15 年前

    通过Webrat,您可以:

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

    第307页,RSPEC手册

        9
  •  1
  •   Pikachu    14 年前

    显示:无解决方案不适用于使用硒驱动器的水飞蓟,因为硒抱怨与不可见元素的相互作用。 如果尝试上述解决方案,可能会看到以下错误消息:

    Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotVisibleError)
    
        10
  •  1
  •   SztupY    13 年前

    您可以尝试发送新行:

    find_field('field2').native.send_key("\n")
    
        11
  •  0
  •   Patrick    14 年前

    这有点陈词滥调,但很有必要。我用猴子修补水豚来支撑 #submit 元素的方法。

    它不是健壮的,因为它幼稚地从每个输入元素的 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
    
        12
  •  0
  •   Abhisek    12 年前

    试试这个……

    find(:css, "input[name$='login']").native.send_keys :enter
    
    推荐文章