我一直在尝试设置 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"
中的示例匹配
3)更改视图以手动添加 id (此答案)
4)将调用更改为(以防万一这是路由的问题) "Name"
<%= f.text_field :name, id: "Name" %>
get sign_up_path
get "/sign_up"
所有这些仍然给我同样的错误,这让我认为页面由于某种原因没有正确加载。但是,我在同一上下文中有一个不同的(通过)测试,它断言页面具有正确的标题,所以我知道页面确实被正确加载(在 中setup
)。
基于此(并根据此答案),问题似乎只是该fill_in
方法在尝试访问字段之前没有等待页面加载。根据这个建议,我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
根据这个答案改变,但这没有效果。我尝试ActionDispatch::IntegrationTest
在 test_helper 文件(其中包括 Capybara)的类中以及测试本身中设置它。
然后我尝试添加puts page.body
通过测试(在它断言正确标题之前和之后),我得到了相同的输出。然后,我找到了这个答案,终于让控制台打印出页面的 HTML。我又尝试了一件让 Capybara 填写字段的方法:
6)将调用更改fill_in
为 say @response.fill_in
,因为@response
似乎做了我认为page
变量应该做的事情。
所以,我对此有两个问题:
1)page
变量实际上指的是什么?我的应用程序的 doctype 声明是 just <!DOCTYPE html>
,所以我不知道它从哪里得到旧的。
2) 为什么 Capybara 不能找到/填写这些字段?