testing服务器上的seleniumtesting随机失败

我正在使用nodejs和nighwatch进行testing自动化的项目。 这里的问题是testing不可靠,并给出很多误报。 我尽一切努力使他们稳定,仍然得到了错误。 我经历了一些博客,如https://bocoup.com/blog/a-day-at-the-races ,并做了一些代码重构。 有没有人有一些build议来解决这个问题。 在这个时候,我有两个select,要么用Java重写代码(从解决scheme中删除nodejs和nightwatch,因为我更喜欢Java,然后是Javascript,大多数情况下,要与Javascript的非阻塞性质斗争)快照/审查应用程序日志/一次运行一个testing。

testing环境 :-

  • 服务器-Linux
  • 显示 – Framebuffer
  • 总计虚拟机的-9与selenium节点并行运行testing。
  • 浏览器 – Chrome

我得到的错误types是找不到元素。 大多数情况下,尽快加载页面,testing就会失败。 我已经设置了80秒的超时时间,所以不能发出。 testing是并行运行,但在单独的虚拟机,所以我不知道是否可以是问题。

编辑1: – 正在研究这个知道根本原因。 我做了下面的事情,以消除随机失败: – 一。 添加–suiteRetries重试失败的案例。 湾 通过错误的截图和DOM源。 一切似乎都很好。 C。 用明确的等待replace了browser.pause

同时在debugging时我观察到一个问题,也许这是导致随机故障的问题。 这是代码片段

for (var i = 0; i < apiResponse.data.length; i++) { var name = apiResponse.data[i]; browser.useXpath().waitForElementVisible(pageObject.getDynamicElement("@topicTextLabel", name.trim()), 5000, false); browser.useCss().assert.containsText( pageObject.getDynamicElement("@topicText", i + 1), name.trim(), util.format(issueCats.WRONG_DATA) ); 

}

我添加了xpath检查来validation,如果我足够等待文本出现。 我观察到可见断言正在通过,但在接下来的断言中,@topicText将作为之前的值或为null。这是一个间歇性问题,但在testing服务器上频繁发生。

脆弱的UI端到端testing没有魔力。 在理想的世界里,会有一个选项set avoid_random_failures=true ,可以快速轻松地解决问题,但现在只是一个梦想。

在Java中简单的重写所有的testing并不能解决问题,但是如果你在java中感觉更好,那么我肯定会朝那个方向发展。


正如你从这篇文章中已经知道的那样在Selenium UItesting中避免随机失败在UItesting中有三种常用的避免竞争条件的技术:

  1. 使用恒定的sleep
  2. 使用WebDriver的“隐式等待”参数
  3. 使用显式等待(WebDriverWait + ExpectedConditions + FluentWait)

WebDriver:Advanced Usage中还简要提及了这些技术,您也可以在这里阅读这些技术: 避免使用脆弱UItesting的技巧

方法1和方法2通常不被推荐,它们有drawbaks,它们可以在简单的HTML页面上很好地工作,但是它们在AJAX页面上不是100%可实现的, 它们减慢了testing的速度 。 最好的是#3 – 明确的等待。


为了使用技术#3(显式等待)你需要熟悉下面的WebDriver工具(我指向他们的java版本,但是有其他语言的对应):

  • WebDriverWait类
  • ExpectedConditions类
  • FluentWait – 很less使用,但在一些困难的情况下非常有用

ExpectedConditions有许多预定义的等待状态,最常用的(以我的经验)是ExpectedConditions#elementToBeClickable ,它等待一个元素可见并启用,以便您可以单击它。

如何使用它 – 一个例子:说你打开一个表单,其中包含你想要input数据的几个领域。 通常,只要等到第一个字段出现在页面上,就可以编辑(可点击):

 By field1 = By.xpath("//div//input[.......]"); By field2 = By.id("some_id"); By field3 = By.name("some_name"); .... .... WebDriwerWait wait = new WebDriverWait( driver, 60 ); // wait max 60 seconds // wait max 60 seconds until element is visible and enabled such that you can click it // if you can click it, that means it is editable wait.until( ExpectedConditions.elementToBeClickable( field1 ) ).sendKeys("some data" ); driver.findElement( field2 ).sendKeys( "other data" ); driver.findElement( field3 ).sendKeys( "name" ); .... 

上面的代码等待,直到field1在页面被加载和渲染之后变为可编辑 – 但不再是,只要它是坏的 。 如果该元素在60秒后将不可见并可编辑,则testing将失败并显示TimeoutException
通常只需要等待页面上的第一个字段,如果它变为活动的,那么其他字段也将是。