Geb测试在Chrome中通过,在PhantomJS中失败



我注意到,一些Geb功能测试在Chrome中通过,但在PhantomJS中失败,所有其他变量保持不变。这种情况主要发生在具有某种异步活动的页面上——对$(selector).click()的一次调用会触发一个更新DOM的事件处理程序,并且DOM更新需要在调用$(anotherSelector).click()之前完成。

我可以通过积极使用waitFor使PhantomJS测试再次通过,但我不明白为什么PhantomJSGhostDriver而不是Chrome驱动程序需要这样做。

不幸的是,我还不能构建一个与应用程序隔离的最小测试用例。

我能得到的唯一建议是始终确保测试中围绕异步活动的任何操作都由waitFor语句保护。您将避免出现这样的问题:在测试尝试访问页面中的新/修改的元素之前,一个驱动程序足够快地完成异步活动,而另一个则不然。当您开始在CI上运行测试时,在异步活动中不使用waitFor也会让您感到痛苦,因为CI通常较慢,并且您会在测试页面中看到更多与异步性相关的失败。

我也不认为使用waitFor来保护测试中的每个异步活动是攻击性的。您必须记住,waitFor会定期轮询条件,并在条件满足后立即继续-因此,如果您的浏览器很快,并且页面在waitFor第一次轮询之前得到更新,那么您在速度方面根本不会受到惩罚,但如果没有,则您可以保证会重试异步操作,以查看条件是否已完成实现。我觉得有攻击性的是使用高得离谱的超时,比如30秒,而这些超时绝对不需要——这只是意味着,如果你的测试失败,需要很长时间才能实现。

我最近有过使用IE和Firefox的经历。这是一个你可以尝试的列表:

  1. 当然,waitFor{}/(timeout:)是你的朋友
  2. 我确信Chrome和PhantomJS的行为方式并不完全相同。所以,手动尝试观察差异,然后使用这样的东西:

    if(System.properties["geb.env"]=="chrome") { $(selector).click() } else { // Do something else }

最新更新