我正在使用Selenium Webdriver运行自动化测试。我的测试之一打开登录页面,输入凭据,然后单击登录按钮。当我在本地运行它时,我可以看到它已成功登录到站点,但是即使我看到它移至下一页,我的测试也会在click方法上引发错误。我也在使用Chrome驱动程序。
关于错误的文字说:
OpenQA.Selenium.WebDriverException:'对远程服务器的HTTP请求 URL http://localhost:4444/click的WebDriver服务器在以下时间后超时 60秒。
内部异常WebException:请求被中止:操作 已超时。
这是我用来查找元素并单击它的代码:
private IWebElement LoginButton => Wait.Until(d => Driver.FindElementByCssSelector(".btn"));
private void ClickLoginButton()
{
LoginButton.Click();
}
其他网站的其他点击方法都可以正常工作,我似乎仅通过此按钮看到此错误。
答案 0 :(得分:0)
Selenium执行click()
时,它将尝试等待页面加载。从docs
Click()方法将尝试阻止,直到页面加载完毕
如果IWebDriver
没有收到此指示(如果有内存,则为document.readyState
),它将以WebDriverException
结尾。
没有任何“漂亮”的解决方案。一种选择是在驱动程序初始化中设置ChromeOption
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.AddAdditionalCapability("pageLoadStrategy","none");
IWebDriver driver = new ChromeDriver(chromeOptions);
但这会影响所有测试。
另一种选择是在此特定按钮中捕获WebDriverTimeoutException
private void ClickLoginButton()
{
try
{
driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(1));
LoginButton.Click();
}
catch (WebDriverTimeoutException) { }
finally
{
driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(originalTime));
}
}
答案 1 :(得分:-1)
我遇到了同样的问题: 发送到远程WebDriver服务器的URL http://localhost:17553/session/1a94ba744cb6dc03af7d65bf58003eff/element/0.42183143444524296-3/click的HTTP请求 60秒后超时
在我的情况下,在ChromeDriver构造函数中指定超时会有所帮助
/// <summary>
/// Initializes a new instance of the <see cref="ChromeDriver"/> class using the specified path
/// to the directory containing ChromeDriver.exe, options, and command timeout.
/// </summary>
/// <param name="chromeDriverDirectory">The full path to the directory containing ChromeDriver.exe.</param>
/// <param name="options">The <see cref="ChromeOptions"/> to be used with the Chrome driver.</param>
/// <param name="commandTimeout">The maximum amount of time to wait for each command.</param>
public ChromeDriver(string chromeDriverDirectory, ChromeOptions options, TimeSpan commandTimeout)
: this(ChromeDriverService.CreateDefaultService(chromeDriverDirectory), options, commandTimeout)
{
}