我正在开发一个使用nodejs和nighwatch进行测试自动化的项目。这里的问题是测试不可靠并且给出了很多误报。我做了一切使他们稳定并仍然得到错误。我浏览了一些像https://bocoup.com/blog/a-day-at-the-races这样的博客,并做了一些代码重构。有没有人有一些建议来解决这个问题。此刻我有两个选择,要么我用Java重写代码(从解决方案中删除nodejs和nightwatch,因为我在Java和Javascript中更加舒适。大部分时间,都在努力解决Javascript的非阻塞特性)或拍摄快照/查看应用程序日志/一次运行一个测试。
测试环境: -
我得到的错误类型是找不到元素。大多数情况下,一旦加载页面,测试就会失败。我已经为超时设置了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。这是间歇性问题,但在测试服务器上经常发生。
答案 0 :(得分:2)
没有灵丹妙药可以轻松实现UI端到端测试。在理想的世界中,会有一个选项set avoid_random_failures=true
可以快速轻松地解决问题,但现在它只是一个梦想。
简单地重写Java中的所有测试都无法解决问题,但如果你在java中感觉更好,那么我肯定会朝那个方向努力。
正如您在本文Avoiding random failures in Selenium UI tests中已经知道的那样,在UI测试中有3种常用的避障技术用于竞争条件:
sleep
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
通常只需要等待页面上的第一个字段,如果它变为活动状态,那么其他字段也将是。