gpt4 book ai didi

node.js - 测试服务器上的 Selenium 测试随机失败

转载 作者:太空宇宙 更新时间:2023-11-03 21:53:26 25 4
gpt4 key购买 nike

我正在开发一个使用 Nodejs 和 nightwatch 进行测试自动化的项目。这里的问题是测试不可靠并且会给出很多误报。我尽一切努力使它们稳定,但仍然出现错误。我浏览了一些博客,例如 https://bocoup.com/blog/a-day-at-the-races并进行了一些代码重构。有没有人有一些建议来解决这个问题。目前我有两个选择,要么用 Java 重写代码(从解决方案中删除 Nodejs 和 nightwatch,因为我对 Java 比 Javascript 更熟悉。大多数时候,与 Javascript 的非阻塞性质作斗争)或采用快照/查看应用程序日志/一次运行一个测试。

测试环境:-

  • 服务器 -Linux
  • 显示 - 帧缓冲区
  • VM 总数为 -9,其中 Selenium Node 并行运行测试。
  • 浏览器 - Chrome

我得到的错误类型是找不到元素。大多数情况下,页面加载后测试就会失败。我已经设置了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。这是一个间歇性问题,但在测试服务器上经常发生。

最佳答案

没有什么 Elixir 可以让 UI 端到端测试变得脆弱。在理想的情况下,会有一个选项 setvoid_random_failures=true 可以快速轻松地解决问题,但目前这只是一个梦想。

简单地用 Java 重写所有测试并不能解决问题,但如果你感觉 Java 更好,那么我肯定会朝这个方向发展。

<小时/>

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

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

WebDriver: Advanced Usage 上也简要提到了这些技术。 ,您还可以在这里阅读有关它们的信息:Tips to Avoid Brittle UI Tests

方法 1 和 2 一般不推荐,它们有缺点,在简单的 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 变得可编辑 - 但不再是这样,只要它是 neccesarry 即可。如果该元素在 60 秒后不可见且不可编辑,则测试将失败并显示 TimeoutException
通常只需要等待页面上的第一个字段,如果它变为事件状态,那么其他字段也会变为事件状态。

关于node.js - 测试服务器上的 Selenium 测试随机失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47362779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com