测试服务器上的硒测试随机失败
我正在使用nodejs和nighwatch进行测试自动化的项目。这里的问题是测试不可靠,并给出很多误报。我尽一切努力使他们稳定并仍然遇到错误。我浏览了一些博客,如https://bocoup.com/blog/a-day-at-the-races,并做了一些代码重构。有没有人有一些建议来解决这个问题。在这一刻我有两个选择,要么我用Java重写代码(从解决方案中删除nodejs和nightwatch,因为我更喜欢Java和Javascript,大多数情况下,要与Javascript的非阻塞性质斗争)快照/审查应用程序日志/一次运行一个测试。测试服务器上的硒测试随机失败
测试环境: -
- 服务器-Linux
- 显示 - 帧缓冲
- 总VM的-9硒节点并行运行测试。
- 浏览器 - 铬 ,我得到的是没有找到元素错误的
类型。大多数情况下,页面加载后测试都会失败。我已经为超时设定了80秒,所以时间不会成问题。测试并行运行,但在单独的虚拟机上运行,所以我不知道它是否可以成为问题。
编辑1: - 正在研究此问题以了解根本原因。我做了以下事情以消除随机失败: - a。添加--suiteRetries以重试失败的案例。 b。通过错误截图和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。这是一个间歇性问题,但在测试服务器上频繁发生。
脆弱的UI端到端测试没有灵丹妙药。在理想的世界中,将会有一个选项set avoid_random_failures=true
,可以快速轻松地解决问题,但现在它只是一个梦想。
在Java中简单重写所有测试并不能解决问题,但如果您在java中感觉更好,那么我肯定会朝这个方向前进。
正如你已经从这篇文章中知道Avoiding random failures in Selenium UI tests有在UI测试3个常用避免技术竞争条件:使用常数sleep
- 使用显式等待(WebDriverWait + ExpectedConditions + FluentWait)
这些技术进行了简要的WebDriver: Advanced Usage提到的,你也可以在这里读到过:Tips to Avoid Brittle UI Tests
方法1和2,一般不推荐使用,他们有drawbaks,他们能很好地在简单的HTML网页的工作,但他们都没有100%可以在AJAX页面上实现,并且它们减慢了测试。最好的是#3 - 明确的等待。
为了使用技术#3(明确的等待),你需要熟悉并适应以下webdriver的工具(我点了他们的Java版本,但他们有其他语言的同行):
- WebDriverWait类
- ExpectedConditions类
- FluentWait - 使用很少,但在一些困难的情况下非常有用
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
。
通常只需要等待页面上的第一个字段,如果它变为活动状态,那么其他字段也会变为活动状态。
是的,我知道不会有任何确定的方法来做到这一点,但希望我选择最好的方式。你给出的建议很好。我会尝试并更新。 –
您可以与错误堆栈跟踪一起分享您的代码试用吗? – DebanjanB
“超时80秒”是什么意思?你是否执行了一些明确的等待,你在页面中定位的第一个元素,在80秒后失败,它不存在?或者你总是等待80秒? – danidiaz
@danidiaz - 是的,我正在执行显式等待,最大超时时间为80秒。 –