2012-12-08 89 views
3

我一直在試圖建立水豚,以測試形式,但我不斷收到錯誤
cannot fill in, no text field, text area or password field with id, name, or label 'Name' found水豚爲什麼不填充這些表單元素?

以下是我在我的觀點:

<%= form_for(@user) do |f| %> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    ... 
    <%= f.submit "Create Account", class: "btn btn-large btn-primary" %> 
<% end %> 

這使得下面的HTML:

<label for="user_name">Name</label> 
<input id="user_name" name="user[name]" size="30" type="text" /> 

因此,它似乎應該是基於標籤找到字段。

這裏是我的user_pages_test.rb文件有(我使用測試::單位和早該上下文):

context "sign up page" do 
    should "add user to database when fields are filled in" do 
    fill_in "Name", with: "Bubbles" 
    ... 
    click_button "Create Account" 
    end 
end 

這是我到目前爲止已經試過:

1)改變調用fill_in以匹配fill_in "user_name", with: "Bubbles"
2)改變呼叫fill_inpage.fill_in "Name", with: "Bubbles"該示例中documentation
3匹配)改變視圖手動添加ID的ID "Name"<%= f.text_field :name, id: "Name" %>this答案)
4)改變調用get sign_up_pathget "/sign_up"(如果它是與路由的問題)

所有這些仍然給我同樣的錯誤,這讓我覺得頁面ISN由於某種原因無法正確加載。不過,我在同一個上下文中有一個不同的(通過)測試,它聲明頁面具有正確的標題,所以我知道該頁面正確加載(在setup中)。

基於此(並根據this答案),看起來問題可能是fill_in方法在嘗試訪問字段之前未等待頁面加載。據this建議,我增加了行puts page.body在我的測試中看到,HTML是被完全加載之前,它試圖以填補領域,並得到了以下的輸出:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 

所以,我很確定fill_in只是不等待頁面加載。我然後嘗試

5)更改Capybara.default_wait_time根據this答案,但這沒有效果。我嘗試在test_helper文件(其中包括Capybara)中的ActionDispatch::IntegrationTest類中設置它,並且也在測試本身中進行設置。

然後我試着在合格的測試中加入puts page.body(它聲明瞭正確的標題之前和之後),並且我得到了相同的輸出。然後,我發現this的答案,並最終拿到控制檯打印出頁面的HTML。我想一兩件事讓水豚填寫以下字段:

6)改變了呼叫fill_in@response.fill_in,因爲@response似乎做什麼,我認爲page變量是應該做的。

所以,我對這個兩個問題:

1)什麼是page變量實際上是指什麼?我的應用程序的doctype聲明只是<!DOCTYPE html>,所以我不知道它從哪裏得到舊的。

2)爲什麼水豚不能找到/ fill_in這些字段?

+0

它有助於在訪問頁面前填寫嗎?它已經爲我解決了類似的問題,但我還沒有想出爲什麼.... :-) – froderik

+0

也 - 你在用什麼驅動程序?表單不是動態加載的? – froderik

+0

如果這是註冊表單,是否有機會將這些字段/ id作爲登錄表單重複(也許是隱藏)在頁面上?如果還有另外一個有這些值的領域,水豚可能會遇到麻煩。 – cjspurgeon

回答