Capybara/Poltergeist,扩展 Accordion Table 扩展间歇性失败

Capybara/Poltergeist, expanding Accordion Table expanding intermittent failure

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

基本上我有一个 table 有 5 列左右。单击时将展开 table 并显示更多信息。在这个新信息中有一个我正在尝试点击的按钮。

这是 table 自己所在行的 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>

table html 本身有一个 ID 和所有内容,但我需要单击行本身中的任何一列以使其展开。

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

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

当 table 展开时,它基本上会生成一个新的 <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 => 'John Doe').click click_link('The Button')

它似乎有 50% 的时间有效。

当使用一些带有动画的 Capybara 驱动程序时,点击可能会错过目标。出现这种情况是因为计算了鼠标点击发生的位置,创建了鼠标事件,并提交给"browsers"队列进行处理。在处理事件之前,目标元素可能会移动到足以使点击错过该元素的程度。有几种方法可以解决这个问题

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

  2. 在尝试单击之前休眠一小段时间,以便动画有时间完成 - 这速度较慢,但​​仍会保持 "real" 鼠标点击像用户会。

  3. 使用#trigger 来模拟点击 - element.trigger(:click) - 这会很快,但可能会短路很多已经完成的事情,以确保测试有效地复制用户可以做的事情因此可能导致错过失败的测试。应该作为不得已的手段