【问题标题】:Capybara fill_in doesn't work水豚fill_in不起作用
【发布时间】:2012-08-06 20:58:46
【问题描述】:

html sn-p:

<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 %>
...

【问题讨论】:

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


    【解决方案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(&lt;form&gt; 标签包裹了&lt;input&gt; 标签,然后看看这是否使规范通过。

    原始答案:

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

    其他尝试:

    1. 删除within 块,看看它是否有效。
    2. 尝试在fill_in 中使用该字段的id 而不是它的name,即:fill_in "task_content", :with =&gt; "This is a new task"',看看是否可行。

    【讨论】:

      【解决方案2】:

      我看不出测试代码和 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>
      

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

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

      【讨论】:

      • 好的,所以您已经将输入元素包装在表单包装器中,所以看起来这不是问题。
      【解决方案3】:

      关于水豚的一些有趣的事情https://github.com/thoughtbot/capybara-webkit/issues/253

      【讨论】:

        猜你喜欢
        • 2011-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多