C# 由于Azure DevOps上的超时,随机Selenium E2e测试失败,但可以在本地和远程Selenium上工作(BrowserStack Automation)

C# 由于Azure DevOps上的超时,随机Selenium E2e测试失败,但可以在本地和远程Selenium上工作(BrowserStack Automation),c#,selenium,selenium-webdriver,azure-devops,webdriverwait,C#,Selenium,Selenium Webdriver,Azure Devops,Webdriverwait,我有一套Selenium测试,它们在我的本地环境中运行良好,并使用Browserstack Automation,但在Azure DevOps上失败 在Azure Devops上运行时,没有配置或设置更改 我们遵循了此处的所有文档: 随机测试失败,永远不会是相同的测试 由于超时,测试总是失败。我等待页面加载5分钟,这样就不会出现超时太少的情况 没有防火墙,应用程序是公共的 身份验证始终成功,因此测试能够加载应用程序 不知道下一步该做什么 下面是Azure DevOps日志的副本。4次测试通过,但

我有一套Selenium测试,它们在我的本地环境中运行良好,并使用Browserstack Automation,但在Azure DevOps上失败

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

我们遵循了此处的所有文档:

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

由于超时,测试总是失败。我等待页面加载5分钟,这样就不会出现超时太少的情况

没有防火墙,应用程序是公共的

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

不知道下一步该做什么

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

该测试使用BrowserStack Automation(远程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\1\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\1\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\1\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\1\s\TestResults\672f4d28-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.
代码块中的几行代码有助于更好地分析问题

但是,由于您的测试总是因为超时而失败,因此值得一提的是,通常情况下,TimeoutException是失败的结果。然而,也可能存在其他问题

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

  • 正如你提到的,我等待页面加载5分钟。。。这将违反所有最佳做法。相反,您需要实现,或者
:不要混合使用隐式和显式等待。这样做可能会导致不可预测的等待时间

  • 您可以在中找到详细的讨论

  • 如果您使用的是ChromeDriverChrome浏览器,则必须根据以下条目确保二进制文件兼容:

    • ChromeDriver v2.44:支持ChromeDriver v69-71(与ChromeDriver 2.43相同,但有额外的错误修复,于2018年11月20日发布)
    • ChromeDriver v2.43:支持Chrome v69-71
    • ChromeDriver v2.42:支持Chrome v68-70
    • ChromeDriver v2.41:支持Chrome v67-69
  • 不同的浏览器呈现不同的内容。因此,您需要确保您正在使用的应用程序得到优化
  • 根据目前的情况,以下是首选方案列表:

  • 使用CssSelector和XPath在性能方面存在一些差异。一些外卖:
    • 首先,XPath和CSS在性能上没有显著差异
    • 在旧浏览器(如IE8)中遍历DOM不适用于CSS,但适用于XPath。XPath可以向上遍历DOM(例如从子对象到父对象),而CSS只能向下遍历DOM(例如从父对象到子对象)。然而,不能在旧浏览器中使用CSS遍历DOM并不一定是一件坏事,因为这更多地表明您的页面设计欠佳,可能会从一些有用的标记中获益
    • 支持CSS的一个论点是,CSS更具可读性、简洁性,而CSS是一种主观调用
    • 提到您应该使用CSS,因为应用程序就是这样构建的。这使得测试更容易编写、讨论,并让其他人帮助维护
    • 建议采用一种更混合的方法——首先关注ID,然后关注CSS,只有在需要时才利用XPath(例如,访问DOM),XPath对于高级定位器总是更强大
    • 您可以在中找到详细的讨论

结论
考虑到上述因素,您需要明智地实施上述方法以及上述讨论的其他方法,这些方法将帮助您摆脱超时现象。以下是我将采取的一些步骤:

  • 在类似的情况下,帮助我们的是临时在测试中添加一个录像机,然后在VM上从开始到失败观察测试执行过程。视频中可能有一些线索,有助于了解到底出了什么问题

  • 此外,我会再次检查,以确保Azure上的浏览器版本与运行时的版本完全相同,因为运行时一切正常。让它们保持一致对于确保没有“魔力”至关重要。默认浏览器窗口大小相同

  • 我会对不同测试失败的地方做更详细的分析

    • 是否有可能发现不同测试失败之间的相似性。它总是在点击后发生吗?在重新加载页面之后?还有其他类似的吗?如果是-尝试使用最奇怪但最简单且有时能挽救生命的解决方案,并在失败前的操作前后添加3-5秒的睡眠时间。(添加只在Azzure跑步时才发生的睡眠条件)(是的,不推荐睡眠,{很多不推荐睡眠的众所周知的信息可能都在这里}但是……如果它们神奇地保存了你的跑步记录,你可以用一些智能等待来替换它们)
    • 故障是否可能在某个特定的时间发生?在同一时间后运行开始?在白天的同一时间
  • 如果在代码中使用日期/时间API,请确保系统时间/区域设置/时区设置完全相同。或者在测试运行期间天数不会改变。总的来说-围绕日期进行调查


  • 我知道上面的建议更像是一个一般性的建议,但根据我的经验,这种“随机失败”可能是由任何看起来“不值得注意”的事情造成的

    测试失败时是否存在常见异常?您使用的是Hosted agent还是Private agent?@Guy Hosted,异常总是超时。超时仅在页面加载时发生?或者也在
    driver.findElement()
    中?@jfar使用您的代码试用和错误堆栈跟踪更新问题