为什么Capybara没有填写这些表格元素?

时间:2012-12-08 19:06:05

标签: ruby-on-rails capybara integration-testing

我一直试图设置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_inpage.fill_in "Name", with: "Bubbles"以匹配documentation中的示例 3)更改视图以使用"Name"this答案)手动添加标识<%= f.text_field :name, id: "Name" %> 4)将呼叫更改为get sign_up_pathget "/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不能找到/填充这些字段?

1 个答案:

答案 0 :(得分:1)

您需要使用visit方法正确设置页面对象。 capybara documentation表示默认访问“/”,如果您想访问其他页面,则需要进行显式调用。阅读有关the difference between visit and get的内容可能也会有所帮助。