Selenium click 方法正在执行然后超时
Posted
技术标签:
【中文标题】Selenium click 方法正在执行然后超时【英文标题】:Selenium click method is executing and then timing out 【发布时间】:2018-08-09 10:51:25 【问题描述】:我正在使用 selenium webdriver 来运行我的自动化测试。我的一项测试打开了一个登录页面,输入凭据并单击登录按钮。当我在本地运行它时,我可以看到它已成功登录到该站点,但是即使我已经看到它移动到下一页,我的测试也会在 click 方法上引发错误。我也在使用 Chrome 驱动程序。
错误上的文字说:
OpenQA.Selenium.WebDriverException: '对远程的 HTTP 请求 URL http://localhost:4444/click 的 WebDriver 服务器在之后超时 60 秒。
Inner Exception WebException: The request was aborted: The operation 已超时。
这是我用来定位元素并单击它的代码:
private IWebElement LoginButton => Wait.Until(d => Driver.FindElementByCssSelector(".btn"));
private void ClickLoginButton()
LoginButton.Click();
其他网站的其他点击方法工作正常,我似乎只看到此按钮出现此错误。
【问题讨论】:
您的chromedriver
和浏览器版本是什么?
@guy Chrome 浏览器版本为 68.0.3440.106,chromedriver 为 2.41
浏览器已导航到下一页,但如果您仔细查看,该页面仍在浏览器中加载。这有很多很多潜在的原因......互联网速度慢,页面或网络服务器问题等等。它是否始终如一地发生?当您手动执行场景时会发生这种情况吗?您可以访问开发人员吗?如果是这样,请询问他们为什么会发生这种情况,也许他们可以进行调查并找到解决方法。
【参考方案1】:
当 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 秒吗?对于这种情况,您似乎会将其设置为高于 60 秒。 @JeffC 点击导航到下一页,OP可以看到。如果它在 60 秒内没有被 loafed,它可能不会加载更长的时间,所以等待 60 秒也没有意义。 是的,但是 1s?即使在精心设计的网站/页面上,这也几乎可以保证失败。不管怎样,这并不能真正解决问题。它只是失败得更快......在许多情况下可能会是假阴性。 @JeffC 我提到这个解决方案是针对我们知道有问题的这个按钮。 这个按钮是登录按钮。我假设它会被大量使用。导致它立即(1s)失败并不能真正解决问题,是吗?【参考方案2】:我遇到了同样的问题: 对 URL http://localhost:17553/session/1a94ba744cb6dc03af7d65bf58003eff/element/0.42183143444524296-3/click 的远程 WebDriver 服务器的 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)
【讨论】:
以上是关于Selenium click 方法正在执行然后超时的主要内容,如果未能解决你的问题,请参考以下文章