ExecuteScript

时间:2016-08-11 20:50:38

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

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

我首先将超时设置为可笑的长度:

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

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

我能做些什么来避免这种情况吗?即使是黑客或解决方法在这一点上也会很好。

3 个答案:

答案 0 :(得分: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;"));

答案 1 :(得分:0)

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

  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;
                }
            });

答案 2 :(得分:0)

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

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

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