我一直在試圖建立水豚,以測試形式,但我不斷收到錯誤
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_in
到page.fill_in "Name", with: "Bubbles"
該示例中documentation
3匹配)改變視圖手動添加ID的ID "Name"
與<%= f.text_field :name, id: "Name" %>
(this答案)
4)改變調用get sign_up_path
到get "/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這些字段?
它有助於在訪問頁面前填寫嗎?它已經爲我解決了類似的問題,但我還沒有想出爲什麼.... :-) – froderik
也 - 你在用什麼驅動程序?表單不是動態加載的? – froderik
如果這是註冊表單,是否有機會將這些字段/ id作爲登錄表單重複(也許是隱藏)在頁面上?如果還有另外一個有這些值的領域,水豚可能會遇到麻煩。 – cjspurgeon