2012-12-08 52 views
3

我一直在试图建立水豚,以测试形式,但我不断收到错误
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_inpage.fill_in "Name", with: "Bubbles"该示例中documentation
3匹配)改变视图手动添加ID的ID "Name"<%= f.text_field :name, id: "Name" %>this答案)
4)改变调用get sign_up_pathget "/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这些字段?

+0

它有助于在访问页面前填写吗?它已经为我解决了类似的问题,但我还没有想出为什么.... :-) – froderik

+0

也 - 你在用什么驱动程序?表单不是动态加载的? – froderik

+0

如果这是注册表单,是否有机会将这些字段/ id作为登录表单重复(也许是隐藏)在页面上?如果还有另外一个有这些值的领域,水豚可能会遇到麻烦。 – cjspurgeon

回答