2012-07-06 122 views
3

這是我第一次嘗試水豚,我似乎無法找到爲什麼它無法找到我的表單元素。水豚沒有找到表單元素

每次我試圖找到一個表單元素,

When /^they submit a resolution in Markdown$/ do 
    visit "/resolutions/new" 
    fill_in "title", :with => "Title" 
    fill_in "libelle", :with => "Some text here\n\nNew paragraph" 
    click_button "Submit" 
end 

它不知道它在哪裏,

Scenario: Submission of a resolution     # features/resolutions.feature:5 
    Given the user is a member      # features/step_definitions/user_steps.rb:26 
    When they submit a resolution in Markdown  # features/step_definitions/resolution_steps.rb:8 
     cannot fill in, no text field, text area or password field with id, name, or label 'title' found (Capybara::ElementNotFound) 
     (eval):2:in `fill_in' 
     ./features/step_definitions/resolution_steps.rb:10:in `/^they submit a resolution in Markdown$/' 
     features/resolutions.feature:7:in `When they submit a resolution in Markdown' 

即使它是存在的頁面

<%= form_for(@resolution) do |f| %> 
    <div class="field"> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title %> 
    </div> 
    <div class="field"> 
    <%= f.label :libelle %><br /> 
    <%= f.text_area :libelle %> 
    </div> 
    <div class="actions"> 
    <%= f.submit "Submit" %> 
    </div> 
<% end %> 

,它似乎已經正確渲染。

Started GET "/resolutions/new" for 127.0.0.1 at 2012-07-06 00:47:24 -0400 
    [1m[36m (0.0ms)[0m [1mSAVEPOINT active_record_1[0m 
    [1m[35m (0.2ms)[0m UPDATE "users" SET "last_sign_in_at" = '2012-07-06 04:47:24.980196', "current_sign_in_at" = '2012-07-06 04:47:24.980196', "last_sign_in_ip" = '127.0.0.1', "current_sign_in_ip" = '127.0.0.1', "sign_in_count" = 1, "updated_at" = '2012-07-06 04:47:24.980658' WHERE "users"."email" = '[email protected]' 
    [1m[36m (0.0ms)[0m [1mRELEASE SAVEPOINT active_record_1[0m 
Processing by ResolutionsController#new as HTML 
    Rendered resolutions/_form.html.erb (3.8ms) 
    Rendered resolutions/new.html.erb within layouts/application (4.9ms) 
Completed 200 OK in 18ms (Views: 7.9ms | ActiveRecord: 0.2ms) 
    [1m[35m (0.2ms)[0m rollback transaction 
    [1m[36m (0.0ms)[0m [1mbegin transaction[0m 
    [1m[35m (0.0ms)[0m SAVEPOINT active_record_1 
    [1m[36mUser Exists (0.1ms)[0m [1mSELECT 1 FROM "users" WHERE "users"."email" = '[email protected]' LIMIT 1[0m 
    [1m[35mSQL (0.3ms)[0m INSERT INTO "users" ("authentication_token", "clearance", "confirmation_sent_at", "confirmation_token", "confirmed_at", "created_at", "current_sign_in_at", "current_sign_in_ip", "email", "facebook_uid", "id", "last_sign_in_at", "last_sign_in_ip", "name", "parent", "remember_created_at", "sign_in_count", "unconfirmed_email", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [["authentication_token", nil], ["clearance", 9], ["confirmation_sent_at", nil], ["confirmation_token", nil], ["confirmed_at", nil], ["created_at", Fri, 06 Jul 2012 04:47:25 UTC +00:00], ["current_sign_in_at", nil], ["current_sign_in_ip", nil], ["email", "[email protected]"], ["facebook_uid", nil], ["id", nil], ["last_sign_in_at", nil], ["last_sign_in_ip", nil], ["name", "Normand Portequi"], ["parent", nil], ["remember_created_at", nil], ["sign_in_count", 0], ["unconfirmed_email", nil], ["updated_at", Fri, 06 Jul 2012 04:47:25 UTC +00:00]] 
    [1m[36m (0.0ms)[0m [1mRELEASE SAVEPOINT active_record_1[0m 

看起來很明顯,但我找不到它。我發現了this question,但答案是無用的。即使在審查the Devise+Cucumber example app後,我也無法找到問題所在。

這是殺了我和我的測試。有任何想法嗎?

回答

0

這是一個瘋狂的猜測,但我認爲你需要等待。不確定'fill_in'是否等待頁面可用。我知道'find'會自動等待。

嘗試增加

Capybara.default_wait_time 
+0

感謝您的建議。沒有運氣:我將'Capybara.default_wait_time = 30'設置爲相同的錯誤。 – 2012-07-06 06:53:30

4

嘗試visit "/resolutions/new"後加入puts page.body,看看你的堆棧跟蹤告訴你。您將能夠看到表單字段的ID。例如,雖然我的一列被稱爲「名稱」,但呈現的html中的id是「user_name」。

4

我有一個類似的問題,事實證明,我需要做的是將「id:」字段添加到表單元素本身。

例如,您有:

<div class="field"> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title %> 
</div> 

但如果你將其更改爲:我的text_field元素上添加一個 「id」 字段

<div class="field"> 
    <%= f.label :title %><br /> 
    <%= f.text_field :title, id:"title" %> 
</div> 

注意。我不確定爲什麼Capybara沒有找到這個標籤,但是這對我來說是有效的。希望它可以幫助你(或其他人)。

+0

我放棄了對該項目的測試,並且該項目自此關閉。爲了使其能夠正常工作,必須擁有「id」字段仍然很奇怪。 – 2012-10-31 19:24:22

+0

當我幾分鐘前遇到這個時,這完全爲我節省了一堆時間。謝謝! – n8gard 2013-02-24 04:03:41

+1

根據文檔,水豚應該能夠通過標籤或名稱找到物品(http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions#fill_in-instance_method) 不幸的是,似乎fill_in只能使用id。 – Vasily 2013-09-10 14:11:01

0

如果你的Rails看法是這樣的:

<%= form.text_field :first_name %>

嘗試通過資本第一部分後面有一個空格,然後lowercasing其餘調用的元素。

fill_in "First name", with: 'Elaine'

這應該這樣做,沒有ID屬性必要的。