我一直试图设置Capybara来测试表格,但我一直收到错误
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文件(我使用的是Test :: Unit和shoulda-context):
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
以使ID与fill_in "user_name", with: "Bubbles"
相匹配
2)将通话更改为fill_in
至page.fill_in "Name", with: "Bubbles"
以匹配documentation中的示例
3)更改视图以使用"Name"
(this答案)手动添加标识<%= f.text_field :name, id: "Name" %>
4)将呼叫更改为get sign_up_path
到get "/sign_up"
(如果是路由问题)
所有这些仍然给我相同的错误,这让我觉得页面由于某种原因没有正确加载。但是,我在相同的上下文中有一个不同的(传递)测试,断言页面具有正确的标题,所以我知道页面确实正确加载(在setup
中)。
基于此(并根据this答案),似乎问题可能只是fill_in
方法在尝试访问字段之前没有等待页面加载。根据{{3}}建议,我在测试中添加了行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)根据this答案更改Capybara.default_wait_time
,但这没有效果。我尝试在test_helper文件中的ActionDispatch::IntegrationTest
类中设置它(包括Capybara),以及测试本身。
然后我尝试在传递测试中添加puts page.body
(在断言正确的标题之前和之后),我得到了相同的输出。然后,我找到this回答,最后让控制台打印出页面的HTML。我还试了一下让Capybara填写这些字段:
6)将调用更改为fill_in
以说@response.fill_in
,因为@response
似乎做了我认为page
变量应该执行的操作。
所以,我有两个问题:
1)page
变量实际上指的是什么?我的应用的doctype声明只是<!DOCTYPE html>
,所以我不知道从哪里获得旧的。
2)为什么Capybara不能找到/填充这些字段?
答案 0 :(得分:1)
您需要使用visit
方法正确设置页面对象。 capybara documentation表示默认访问“/”,如果您想访问其他页面,则需要进行显式调用。阅读有关the difference between visit
and get
的内容可能也会有所帮助。