2010-05-09 108 views
23

我有一個測試使用黃瓜,水豚和硒驅動程序。這個測試應該去表格並提交。正常的文本將黃瓜,水豚和硒 - 提交表單沒有按鈕

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" 

的問題是,我沒有在形式 我需要一種方法做OK按鈕,在「form.submit」,沒有任何點擊按鈕或鏈接 - 當您在使用瀏覽器的表單字段中按ENTER時會發生同樣的情況。

我不知道如何告訴水豚提交表格。我該怎麼做?

回答

31

您可以訪問硒send_keys方法來調用返回事件像

find_field('field2').native.send_key(:enter) 
+0

請注意,至少對於我來說,作爲一名司機,你必須使用':Enter' – PragTob 2016-02-03 10:05:24

3

簡而言之:你不能。

某些瀏覽器將不允許您在沒有提交按鈕的情況下提交表單(最值得注意的是Internet Explorer < = 6)。所以這種形式首先是一個壞主意。添加一個提交按鈕,並使用CSS將其定位在屏幕外。

+5

顯示:沒有人想到。它在那裏,但它不是! – Robus 2010-05-09 15:29:03

+1

問題是我無法添加按鈕,因爲我正在測試一個網站,我無法更改源代碼。 – 2010-05-09 21:25:21

+0

「display:none」爲我工作。 – samullen 2011-10-04 20:22:46

1

你可能會推出自己的步驟(例如,我提交表單的鏈接「好」),並自己模擬提交功能。

這裏是在Rails 3中支持「不引人注目」(強調引號)Javascript的JavaScript模擬。該行

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

可能是解決您的問題的線索。完整的代碼是here

+0

這將適用於Selenium驅動程序? – 2010-05-15 16:31:27

+0

我認爲它的確如此。我現在正在使用表單提交,確認對話框在應用程序中沒有問題,並且它們正常工作。 – Chubas 2010-05-15 23:33:56

19

一個簡單的辦法:

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

爲我工作與水豚,envjs。還應該與硒一起工作。

+0

也適用於Poltergeist。 – 2014-02-24 12:08:28

+0

還有另外一個類似的解決方案:[page.execute_script(「$('form#your-form')。submit()」)](http://stackoverflow.com/a/13712246/664833) - 還有,檢查註釋[Capybara :: Session#execute_script](http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session:execute_script)(它表示*'execute_script'應該用在'evaluate_script'之上可能*) - 這只是一個需要考慮的信息。 – user664833 2014-06-24 02:39:33

1

我建議你添加一個提交按鈕,然後用CSS隱藏它。然後你可以測試表單提交,但仍然可以得到你想要的用戶行爲。

5

隨着水豚硒驅動,你可以做這樣的事情:

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 
1

隨着Webrat你可以:

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

頁。 307,RSpec的圖書

9

我必須解決這個問題我自己。在webrat我有這樣的事情:

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 
+2

做伎倆..應該是第一個回答 – 2013-01-05 05:11:56

+1

這是_awesome_,因爲它甚至不需要javascript!所以它不應該依賴於驅動程序的實現(就像世界上其他所有的東西一樣)。特別是,它根本不需要js。 – bchurchill 2013-05-13 13:49:42

0

這是一個有點hackish,但它滿足了需求。我猴子補丁水豚支持元素的方法#submit

這是不健壯,因爲它天真地創建從每一個輸入元素的namevalue屬性POST參數。 (在我的情況下,我所有的<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 
1

顯示:none解決方案無法使用selenium驅動程序與水豚,因爲硒抱怨與不可見元素相互作用。 如果你嘗試,你最終可能會看到以下錯誤消息上面的解決方案:

Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotVisibleError) 
+0

應該是一個評論 – 2013-01-05 04:37:43

1

你可以嘗試發送一個換行符:

find_field('field2').native.send_key("\n") 
0

試試這個..

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