硒单击方法正在执行,然后超时

时间:2018-08-09 10:51:25

标签: c# selenium selenium-webdriver selenium-chromedriver webdriverwait

我正在使用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();
}

其他网站的其他点击方法都可以正常工作,我似乎仅通过此按钮看到此错误。

2 个答案:

答案 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)
    {
    }