随机 Selenium E2e 测试因 Azure DevOps 超时而失败,但在本地和远程 Selenium 上工作(BrowserStack Automate)

Random Selenium E2e Tests Fail because of timeouts on Azure DevOps but work locally and with remote Selenium (BrowserStack Automate)

我有一套 Selenium 测试可以在我的本地环境中完美运行并使用 Browserstack Automate,但在 Azure DevOps 上失败。

在 Azure Devops 上 运行 时没有配置或设置更改。

我们已遵循此处的所有文档:https://docs.microsoft.com/en-us/azure/devops/pipelines/test/continuous-test-selenium?view=vsts

随机测试失败,永远不会相同。

测试总是因为超时而失败。我等待页面加载 5 分钟,所以这不是超时太短的情况。

没有安装防火墙,应用程序是 public。

身份验证始终成功,因此测试能够加载应用程序。

不确定接下来要尝试什么。

以下是 Azure DevOps 日志的副本。 4 个测试通过,但其他所有测试均失败。通常,只有 4-5 次测试失败。

此测试在使用 BrowserStack Automate(远程 selenium)和本地时完美运行。

2018-11-17T05:40:28.6300135Z  Failed   StripeAdmin_WhenOnTab_DefaultSortIsByIdDescending
2018-11-17T05:40:28.6300461Z Error Message:
2018-11-17T05:40:28.6304198Z  Test method CS.Portal.E2e.Tests.Admin.StripeAdmin.StripeAdminTests.StripeAdmin_WhenOnTab_DefaultSortIsByIdDescending threw exception: 
2018-11-17T05:40:28.6305677Z OpenQA.Selenium.WebDriverTimeoutException: Timed out after 300 seconds
2018-11-17T05:40:28.6307041Z Stack Trace:
2018-11-17T05:40:28.6307166Z     at OpenQA.Selenium.Support.UI.DefaultWait`1.ThrowTimeoutException(String exceptionMessage, Exception lastException)
2018-11-17T05:40:28.6307999Z    at OpenQA.Selenium.Support.UI.DefaultWait`1.Until[TResult](Func`2 condition)
2018-11-17T05:40:28.6308188Z    at CS.Portal.E2e.Tests.Utility.WebDriverUtilities.WaitForElement(IWebDriver driver, By by, Boolean mustBeDisplayed) in D:\a\s\CS.Portal.E2e.Tests\Utility\WebDriverUtilities.cs:line 26
2018-11-17T05:40:28.6319651Z    at CS.Portal.E2e.Tests.Admin.StripeAdmin.StripeAdminTests.StripeAdmin_WhenOnTab_DefaultSortIsByIdDescending() in D:\a\s\CS.Portal.E2e.Tests\Admin\StripeAdmin\StripeAdminTests.cs:line 51
2018-11-17T05:40:28.6319982Z 
2018-11-17T05:40:34.4671568Z Results File: D:\a\s\TestResults\VssAdministrator_factoryvm-az416_2018-11-17_03_08_24.trx
2018-11-17T05:40:34.4692222Z 
2018-11-17T05:40:34.4695222Z Attachments:
2018-11-17T05:40:34.4697610Z   D:\a\s\TestResults2f4d28-5082-42e9-a7e7-f5645aadcfd8\VssAdministrator_factoryvm-az416 2018-11-17 03_02_43.coverage
2018-11-17T05:40:34.4697943Z 
2018-11-17T05:40:34.4698278Z Total tests: 34. Passed: 4. Failed: 30. Skipped: 0.

您的代码块中的几行将有助于更好地分析您的问题。

但是,由于 timeouts,您的测试总是失败,因此值得一提的是,通常 TimeoutException失败ExpectedConditions。但是,也可能存在其他问题。

避免这些问题的一些方法如下:

WARNING: Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times.

  • 您可以在

  • 中找到详细的讨论
  • 如果您使用Chrome驱动程序Chrome浏览器,您必须确保根据以下条目,二进制文件是兼容的:

    • ChromeDriver v2.44 : 支持 Chrome v69-71(与 ChromeDriver 2.43 相同,但有额外的错误修复, 2018 年 11 月 20 日发布)
    • Chrome驱动程序 v2.43 : 支持 Chrome v69-71
    • Chrome驱动程序 v2.42 : 支持 Chrome v68-70
    • Chrome驱动程序 v2.41 : 支持 Chrome v67-69
  • 不同的浏览器呈现您正在使用的HTML DOM differently. So you need to ensure that the 已优化。
  • 根据当前 WebDriver-W3C Recommendation the following is the list of preferred Locator Strategies:

  • 使用 CssSelectorXPath性能 上存在一些差异。一些要点:
    • 对于初学者来说,XPath 和 CSS 之间的性能没有显着差异。
    • 在 IE8 等较旧的浏览器中遍历 DOM 不适用于 CSS,但可以使用 XPath。并且 XPath 可以向上遍历 DOM(例如从子到父),而 CSS 只能向下遍历 DOM(例如从父到子)。然而,无法在旧版浏览器中使用 CSS 遍历 DOM 并不一定是坏事,因为它更多地表明您的页面设计不佳并且可以从一些有用的标记中受益。
    • 支持 CSS 的一个论点是它们更具可读性、简短和简洁,同时它是一个主观调用。
    • Ben Burton 提到您应该使用 CSS 因为这就是应用程序的构建方式。这使得测试更容易编写、讨论和让其他人帮助维护。
    • Adam Goucher 说要采用一种更混合的方法——首先关注 ID,然后 CSS,并且仅在需要时才利用 XPath(例如走上 DOM)并且 XPath 对于高级定位器来说总是更强大。
    • 您可以在
    • 中找到详细的讨论

结论

考虑到上述因素,您需要明智地实施 以及上面讨论的其他方法,这将帮助您摆脱 超时 .

以下是我会执行的一些步骤:

  1. 在类似的案例中帮助我们的是临时添加一个录像机来测试然后在虚拟机上观察从开始到失败的测试执行过程。视频中可能有一些线索可以帮助您了解实际问题所在 I was able to find this link for a C# example

  2. 此外,我会仔细检查以确保 Azure 上的浏览​​器版本与 运行 中的浏览器版本完全相同,一切正常。使它们相同对于确保没有 'magic' 至关重要。默认浏览器相同 window 大小。

  3. 我会针对不同测试失败的地方做更详细的分析。

    • 是否可以发现不同测试失败之间的相似之处。它总是在点击后发生吗?重新加载页面后?在其他类似的事情之后?如果是 - 尝试使用最奇怪但最简单且有时可以挽救生命的解决方案,并在失败前添加 3-5 秒睡眠 before/after 一个动作。 (添加只有在 Azzure 运行 时才会发生的睡眠条件)(是的,不推荐睡眠并且{很多众所周知的信息为什么不推荐它们可能已经在这里} 但是......如果他们神奇地保存了你的 运行s 你可以用一些聪明的等待来替换它们)
    • 是否有可能在某个特定时间发生故障?在 运行 开始后的同一时间之后?在白天的同一时间?
  4. 如果您在代码中使用 Date/time API,请确保系统 time/locale/timezone 设置完全相同。或者说测试期间天数没有变化 运行s。总而言之 - 调查日期。

我知道以上更像是一般性建议,但根据我的经验,这样的 "random failures" 可能是由任何看似 "not worth attention" 的字面意思引起的。