Capybara fill_in不起作用

时间:2012-08-09 15:27:03

标签: ruby-on-rails-3 rspec capybara

html片段:

<table id="project_1">
  <thead>
    ...
    <tr>
      <form accept-charset="UTF-8" action="/projects/1/tasks" class="add-task form-search" 
        data-remote="true" id="new_task" method="post"></form>
      <th><input class="input-xlarge" id="task_content" name="task[content]" 
        placeholder="Start typing here to create a task..." size="50" type="text"></th>
      <th><input class="btn" name="commit" type="submit" value="Add Task"></th>
    </tr>
  </thead>
  ...
</table>

与水豚的rspec测试:

it "should create a task", :js => true do
  visit projects_path
  within("#project_#{@project.id}") do
    fill_in "task[content]", :with => "This is a new task"
    save_and_open_page
    click_button 'Add Task'
  end
  page.should have_content("This is a new task")
end

Capybara成功找到了页面上的所有元素,但在页面中(由save_an_open_page生成)字段'task [content]'为空。

这里可能有什么问题?感谢

更新:

从这个erb生成的html代码:

...
<%= form_for [project, Task.new], html: { :class => "add-task form-search" }, remote:   true do |f| %>
  <th><%= f.text_field :content, :class => "input-xlarge", :placeholder => "Start typing here to create a task...", :size => 50 %></th>
  <th><%= f.submit "Add Task", :class => "btn" %></th>
<% end %>
...

3 个答案:

答案 0 :(得分:1)

更新:

封闭的标签(@Steve注意到)可能确实是你的问题。以下是有同样问题的人:form_for closes <form> tag

我怀疑问题可能是表单中的HTML标记。如果删除表格行/标题标记,如下所示:

<%= form_for [project, Task.new], html: { :class => "add-task form-search" }, remote:   true do |f| %>
  <%= f.text_field :content, :class => "input-xlarge", :placeholder => "Start typing here to create a task...", :size => 50 %>
  <%= f.submit "Add Task", :class => "btn" %>
<% end %>

查看是否首先生成正确的HTML(<form>标记包裹<input>标记,然后查看是否使规范通过。

原始回答:

我怀疑问题不在于fill_in,而在于它后面发生了什么(添加任务)。在我自己的测试中,我发现即使测试确实有效,save_and_open_page也不会在实际字段中显示文本。在表单提交后,您确定将新任务添加到页面没有问题吗?

其他尝试:

  1. 删除within块,看看它是否有效。
  2. 尝试在id中使用字段name代替其fill_in,即:fill_in "task_content", :with => "This is a new task"',看看是否有效。

答案 1 :(得分:1)

我看不出测试代码和Capybara调用有什么问题。

在您的标记中,虽然您的input元素看起来都在我期望包含它们的form之外。应该是吗?:

<form accept-charset="UTF-8" action="/projects/1/tasks" class="add-task form-search" 
    data-remote="true" id="new_task" method="post">
  <th><input class="input-xlarge" id="task_content" name="task[content]" 
    placeholder="Start typing here to create a task..." size="50" type="text"></th>
  <th><input class="btn" name="commit" type="submit" value="Add Task"></th>
</form>

(我不确定在form中嵌套tr元素是严格合法的HTML,但也许您需要考虑使用表格的替代方法。“

我通常发现save_and_open_page使用默认的Rack驱动程序非常可靠但你在这里运行JavaScript所以我猜你正在运行selenium或headless-webkit驱动程序。

答案 2 :(得分:0)