我有一些使用 Selenium 并在 Chrome 上运行的 .NET Core 自动化项目。构建在 Jenkins 管道中运行,当前在 Linux 构建代理上运行测试。
当我们在 chrome 83 上运行时,这些测试都运行得很好,但是当我们让我们的开发团队升级到 chrome 85 时,我们开始看到零星的超时。当发生超时时,我们会在每个测试中看到以下错误:
Error Message:
OneTimeSetUp: OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://localhost:41307/session/008798b4a2c52b867ec157b20d89f9b9/url timed out after 60 seconds.
----> System.Threading.Tasks.TaskCanceledException : The operation was canceled.
----> System.IO.IOException : Unable to read data from the transport connection: Operation canceled.
----> System.Net.Sockets.SocketException : Operation canceled
此超时并非孤立于单个测试,但如果发生,则测试运行中的每个测试都会出现相同的错误消息。
平均每运行 2-3 次测试就会发生这种情况。这不是时间问题,因为有时计划的运行成功,有时失败,我可以一遍又一遍地运行测试,背靠背,并且会随机混合成功和失败。
到目前为止我尝试过的:
还值得注意的是,我们还没有在通过 Visual Studio 本地运行时看到这种情况发生。只有当通过我们的 Jenkins 管道执行这些测试时,我们才会看到这种行为。
关于如何解决这些随机超时失败有什么想法吗?
编辑:
添加我用来初始化 chromedriver 的代码:
var chromeOptions = new ChromeOptions();
chromeOptions.AddArguments("--no-sandbox", "--start-maximized");
chromeOptions.AddArguments("--window-size=1920,1080", "--headless"); // Comment out if running locally to see execution
chromeOptions.AddUserProfilePreference("safebrowsing.enabled", "true");
WebDriver = new ChromeDriver(chromeOptions);
我们运行的服务器是无头的,但我保留了启动最大化标志,以便于本地调试。
编辑2:
这是在利用 webDriver 的 OneTimeSetUp 方法中执行的其余代码:
public LoginService(IWebDriver webDriver)
{
_webDriver = webDriver;
}
public void OpenAndLoginToApplication(string applicationUrl, string username, string password)
{
_webDriver.Navigate().GoToUrl(string.Format(LoginPageUrlTemplate, applicationUrl));
_webDriver.SetInputFieldValue(By.Id(UsernameFieldId), InputFieldType.Text, username);
_webDriver.SetInputFieldValue(By.Id(PasswordFieldId), InputFieldType.Text, password);
_webDriver.ClickAndConfirmByElementVisibility(By.Id(LoginButtonId), By.Id(LoggedInUserDropdownId));
}
我一直无法弄清楚为什么会发生这种情况,但我能够解决这个问题。
我发现 Navigate() 到应用程序时发生超时。无论我增加多少超时,我仍然会失败。但是,后续的 Navigate() 调用将会成功。
因此,我的解决方案是,如果我们在初始调用时收到 WebDriverException(超时异常),只需重试导航到应用程序 url。
@Belizzle 我爱你,你的解决方案是唯一对我有帮助的解决方案!