Capybara / Poltergeist,扩大手风琴表扩大间歇性失败

时间:2016-08-11 18:44:52

标签: capybara poltergeist

我在扩展表格/行时遇到问题。我做了一些谷歌搜索,没有找到任何关于这种情况的信息。

基本上我有一个包含5个左右列的表。单击时将展开表格并显示更多信息。在这个新信息里面是一个试图点击的按钮。

以下是表iself的行的HTML:

<thead>
 <tbody>
  <tr class="odd" data-row="0" data-source="/user/01" role="row">
   <td class="sort_1">John Doe</td>
   <td>Person</td>
   <td>Yes</td>
   <td>Yes</td>
   <td> Building 2 </td>
  </tr>
<more table rows here repeated>
</tbody>
</table>

表html本身有一个id和所有内容,但是我需要点击行本身中的任何一列以使其扩展。

我尝试了这个:page.find('td', :text => 'John Doe').click虽然它确实成功了,但是在截取屏幕截图之后它似乎没有显示任何扩展...所以我不确定扩展表是否适用于此实例。然而,重新运行它,它工作....但它不一致。

poltergeist展示的屏幕截图显示扩展表几乎没有显示(就像只是一小部分扩展)。那么也许它没有等待它出现的足够时间?我不确定。

当表格展开时,它基本上会生成一个新的<tr user-data-row="5">,在展开时会显示在上面的行下方。

这里的参考是我在扩展后点击的按钮的HTML:

<div class="col-xs-12 col-sm-5 col-md-5" style="">
 <ul class="list-unstyled">
 <ul class="list-inline">
  <li>
   <a class="btn btn-sm btn-default" href="/stuff/site" data-method="post" rel="no-follow" data-confirm="Generic: Confirmation Dialogue">The Button</a>
  </li>
  <li> </li>
 </ul>
</div>

我起初认为它正在绊倒确认对话弹出窗口,但是Poltergeist应该默认避开那些。而且似乎这样做......所以我不确定可能出现什么问题。由于它不一致我想可能这是一个时间问题。我的Capybara.default_max_wait_time = 15因为数据库在虚拟机上,但到目前为止它还不是问题....

编辑: 失败的代码似乎在此之后:     page.find('td',:text =&gt;'John Doe')。点击     click_link('The Button')

它似乎在50%的时间内起作用。

1 个答案:

答案 0 :(得分:2)

当使用一些带动画的Capybara驱动程序时,点击可能会错过目标。发生这种情况是因为计算了鼠标单击发生的位置,创建了鼠标事件,并将其提交到“浏览器”队列进行处理。在处理事件之前,目标元素可能移动到足以使点击错过元素。有几种方法可以处理这个

  1. 全方位的最佳解决方案(鼠标事件的速度,可靠性和有效性)是在测试环境中禁用动画。这通常可以通过根据所使用的库有条件地设置一些JS变量来完成。

  2. 在尝试点击之前暂停一小段时间以便动画有时间完成 - 这个速度较慢,但​​仍然保持“实际”鼠标点击,这些点击会像用户那样通过页面事件处理。

  3. 使用#trigger来模拟点击 - element.trigger(:click) - 这会很快但可能会缩短很多事情,以确保测试有效地复制用户可以做的事情,因此可以导致错过失败的测试。它应该用作最后的方法