3

我一直在尝试设置 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_pathget "/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 不能找到/填写这些字段?

4

1 回答 1

1

您需要使用该visit方法正确设置页面对象。capybara文档表明默认情况下会访问“/”,如果您想访问其他页面,则需要进行显式调用。了解一下和之间的区别visitget也可能会有所帮助。

于 2012-12-09T10:19:51.500 回答