【问题标题】:Selenium timeout on ExecuteScriptExecuteScript 上的硒超时
【发布时间】: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。有没有类似的东西?
  • 我觉得这很有帮助:stackoverflow.com/questions/15268255/…

标签: c# .net selenium selenium-webdriver timeout


【解决方案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。我正在使用这种方法stackoverflow.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;
                }
            });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2018-02-08
    相关资源
    最近更新 更多