ExecuteScript 上的硒超时

Posted

技术标签:

【中文标题】ExecuteScript 上的硒超时【英文标题】:Selenium timeout on ExecuteScript 【发布时间】:2016-12-18 18:09:24 【问题描述】:

我在使用 Selenium 执行脚本时遇到超时,无论我尝试做什么来避免它们。

我首先将超时设置为非常长:

_driver.Manage().Timeouts().SetScriptTimeout(TimeSpan.FromMinutes(30));               
_driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromMinutes(30));

稍后,我运行了一个预计需要很长时间的脚本(它正在执行一个长时间运行的 POST 请求)。无论我使用ExecuteScript 还是ExecuteAsyncScript,请求都会在60 秒后超时。

有什么办法可以避免这种情况吗?在这一点上,即使是 hack 或解决方法也会很好。

【问题讨论】:

如果这是firefox,你可以尝试修改配置文件:profile.setPreference("dom.max_script_run_time", 0); 0 表示永远等待 我正在使用 Chrome。有没有类似的东西? 我觉得这很有帮助:***.com/questions/15268255/… 【参考方案1】:

与驱动程序的连接有 60 秒超时。更改它的方法是编辑受保护的字段RemoteWebDriver.DefaultCommandTimeout

typeof(RemoteWebDriver)
    .GetField("DefaultCommandTimeout", BindingFlags.NonPublic | BindingFlags.Static)
    .SetValue(null, TimeSpan.FromMinutes(5));

另一种方法是在请求返回后设置一个变量,然后等待它:

((IjavascriptExecutor)driver).ExecuteScript(@"
    window._result = null;
    var req = new XMLHttpRequest();
    req.onreadystatechange = function()
        if(req.readyState == XMLHttpRequest.DONE) 
            window._result = this.responseText);
        
    ;
    req.open('GET', '...');
    req.send();
");

var response = new WebDriverWait(driver, TimeSpan.FromMinutes(5))
    .Until(_ => ((IJavaScriptExecutor)_).ExecuteScript("return window._result;"));

【讨论】:

不幸的是,这些都不适合我。尽管更改了超时,但它仍然会在 60 秒时引发异常。此外,我正在发布一个表单,无论出于何种原因,它似乎不适用于XMLHttpRequest。我正在使用这种方法***.com/a/133997/1195036。 好的,我现在看到了问题。您需要在创建 WebDriver 之前更改 DefaultCommandTimeout。实际上,CommandTimeout 是 WebDriver 的构造函数参数之一。只需将其设置为更好的解决方案,但我会赞成这一点,因为它可以为我指明正确的方向。【参考方案2】:

您最喜欢的 RemoteWebDriverFireFoxDriverChromeDriver)在其某些构造函数重载中采用 commandTimeout 参数。

_driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), new ChromeOptions(), TimeSpan.FromMinutes(30))

在构造实例后似乎无法更改此设置,因此您需要确保以这种方式进行设置。这将防止超时。

【讨论】:

这对我不起作用。我仍然收到来自IJavaScriptExecutor.ExecuteAsyncScript 的 60 秒超时异常 嗨@Jack 当我也使用 ExecuteAsyncScript 方法时,即使脚本已执行,我也会收到此错误。你曾经使用 ExecuteScript 的其他方法,但这似乎不再起作用。你找到解决方法了吗?谢谢 @skinnyWill:我出于某种原因切换到使用 Firefox 驱动程序(不是专门用于超时),但在 Firefox 上,我确实像这样初始化它:pastebin.com/nPVuH4k0希望它有所帮助【参考方案3】:

我会尝试等待整个文档处于就绪状态:

  var driverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(180));
    driverWait.Until(
            driverA =>
            
                try
                
                    var browserStatus = (string)((IJavaScriptExecutor)driverA).
ExecuteScript("return document.readyState");
                    return string.Compare("complete", browserStatus,
 StringComparison.OrdinalIgnoreCase) == 0;
                
                catch (NoSuchWindowException)
                
                    return true;
                
                catch (Exception)
                
                    return false;
                
            );

【讨论】:

以上是关于ExecuteScript 上的硒超时的主要内容,如果未能解决你的问题,请参考以下文章

尝试运行脚本时如何解决mac上的硒问题

使用Python中的硒,单击网页上的“下一步”按钮

为啥我的硒预期条件不能作为 python if 语句中的条件工作?

MAMP phpmyadmin 上的脚本超时传递错误

Chrome加载React应用程序中的“WebExtension :: executeScript:内容脚本注入VM149:1”

当 ExecuteScript(setInterval) 完成时继续 `while` 循环