我一直在试图建立水豚,以测试形式,但我不断收到错误
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