测试服务器上硒测试的随机失败

时间:2017-11-18 05:16:08

标签: node.js selenium nightwatch.js

我正在开发一个使用nodejs和nighwatch进行测试自动化的项目。这里的问题是测试不可靠并且给出了很多误报。我做了一切使他们稳定并仍然得到错误。我浏览了一些像https://bocoup.com/blog/a-day-at-the-races这样的博客,并做了一些代码重构。有没有人有一些建议来解决这个问题。此刻我有两个选择,要么我用Java重写代码(从解决方案中删除nodejs和nightwatch,因为我在Java和Javascript中更加舒适。大部分时间,都在努力解决Javascript的非阻塞特性)或拍摄快照/查看应用程序日志/一次运行一个测试。

测试环境: -

  • 服务器-Linux
  • 显示 - 帧缓冲
  • Total VM' s-selenium节点并行运行测试。
  • 浏览器 - Chrome

我得到的错误类型是找不到元素。大多数情况下,一旦加载页面,测试就会失败。我已经为超时设置了80秒,所以时间不成问题。测试是并行运行的,但是在不同的虚拟机上运行,​​所以我不知道它是否有问题。

编辑1: - 正在努力了解根本原因。我做了以下事情以消除随机失败: - 一个。添加了--suiteRetries以重试失败的案例。 湾通过错误截图和DOM源代码。一切似乎都很好。 C。用显式等待替换了browser.pause

同样在调试时我发现了一个问题,也许这就是导致随机失败的问题。这是代码段

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检查以验证我是否在等待该文本出现。我观察到可见断言正在传递但在下一个断言中@topicText将作为先前值或null。这是间歇性问题,但在测试服务器上经常发生。

1 个答案:

答案 0 :(得分:2)

没有灵丹妙药可以轻松实现UI端到端测试。在理想的世界中,会有一个选项set avoid_random_failures=true可以快速轻松地解决问题,但现在它只是一个梦想。

简单地重写Java中的所有测试都无法解决问题,但如果你在java中感觉更好,那么我肯定会朝那个方向努力。

正如您在本文Avoiding random failures in Selenium UI tests中已经知道的那样,在UI测试中有3种常用的避障技术用于竞争条件:

  1. 使用常量sleep
  2. 使用WebDriver&#34;隐式等待&#34;参数
  3. 使用显式等待(WebDriverWait + ExpectedConditions + FluentWait)
  4. WebDriver: Advanced Usage上也简要提到了这些技巧,你也可以在这里阅读它们:Tips to Avoid Brittle UI Tests

    方法1和2一般不推荐,它们有drawbaks,它们可以在简单的HTML页面上很好地工作,但它们在AJAX页面上不是100%可行,而它们会减慢测试。最好的是#3 - 显式等待。

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

    ExpectedConditions有许多预先确定的等待状态,最常用的(根据我的经验)是ExpectedConditions#elementToBeClickable,等待元素可见并启用,以便您可以单击它。
    /> 如何使用它 - 例如:假设您打开一个页面,其中包含要包含几个要输入数据的字段的表单。通常它应该等到第一个字段出现在页面上并且它是可编辑的(可点击的):

    By field1 = By.xpath("//div//input[.......]");
    By field2 = By.id("some_id");
    By field3 = By.name("some_name");
    By buttonOk = By.xpath("//input[ text() = 'OK' ]");
    ....
    ....
    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" );
    ....
    wait.until( ExpectedConditions.elementToBeClickable( buttonOK)).click(); 
    

    以上代码等待field1在页面加载和呈现后变得可编辑 - 但不再是,只要它是必要的。如果该元素在60秒后不可见并且可编辑,则测试将失败并显示TimeoutException 通常只需要等待页面上的第一个字段,如果它变为活动状态,那么其他字段也将是。