我正在使用watir-webdriver + ruby + rspec + gem parallel_tests。
我的测试用例必须能够取消然后从项目列表中删除项目。 "取消"和"删除"弹出菜单中显示链接。
以下方法验证取消链接gear_dropdown_menu.cancel_job = browser.link(:text, 'Cancel')
是否可见。
Timer.repeat_until_true(30, 1) do
sleep 1
gear_dropdown_menu.cancel_job.visible?
end
当链接出现并且我可以看到它时,接下来我尝试使用这样的代码单击它:
browser.execute_script("
id = $('div.job-actions:visible').data('id');
$('a[href*=\"jobs/'+ id +'/cancel\"]').show().click()
")
div.job-actions:visible - actions popup, where links are placed
我使用data-id属性来指定直接链接href。但看起来watir看不到它。
问题是当我并行执行测试时,3次尝试失败。 当我执行非并行测试时,整体看起来很好。
可能是问题的原因是什么?
更新:添加弹出代码。它不是一个单独的窗口。我点击按钮时出现的隐藏div元素。
<div class="job-actions" data-id="8769" style="top: 329px; right: 0px; display: block;">
<section>
<header>Actions</header>
<ul>
<li class="pause">
<a href="http://host.com/jobs/8769/pause">Pause Job</a>
</li>
<li class="cancel">
<a href="http:/host.com/jobs/8769/cancel" class="cancel">Cancel Job</a>
</li>
</ul>
</section>
</div>
答案 0 :(得分:3)
(文字:'取消')将与列表中的第一个取消按钮相匹配。如果您并行运行测试,则可能会遇到竞争条件,从列表中取消/删除相同的项目。
其他一些提示: 您不必使用Timer。您的代码在功能上等同于内置方法:
gear_dropdown_menu.cancel_job.wait_until_present
另外,你的弹出窗口是一个单独的窗口吗?如果是这样,您不需要使用execute_script(应尽可能避免使用)。你可以使用:
browser.window(title: 'Your Popup Title').use { browser.link(href: /cancel/).click }
(或任何有意义的选择器)
答案 1 :(得分:0)
如果您的问题仅在并行运行时出现,则听起来您可能在测试之间存在依赖关系或干扰,最终会造成竞争条件。
如果您正在进行创建,更新,删除类型操作,那么每个测试都需要使用唯一标识符创建的唯一对象(名称?id's?)如果没有,那么当您需要时,对象可能不存在(不是创建,删除等)或者你可能会遇到冲突,因为对象名称/标识符不是唯一的(所以测试可以重新创建一个对象的新副本另一个测试刚删除,导致第二个测试认为删除失败等等)
如果没有看到更多的代码,那么很难给出更精确的建议,但根据我的经验,当系列完成某些工作时,如果订单被更改,或测试运行独奏或测试并行运行,然后您可能在测试之间存在依赖关系,或者在一个测试之前删除某些内容之前的情况可能会尝试取消或更新相同的内容。