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】:
您最喜欢的 RemoteWebDriver
(FireFoxDriver
或 ChromeDriver
)在其某些构造函数重载中采用 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 上的硒超时的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的硒预期条件不能作为 python if 语句中的条件工作?
Chrome加载React应用程序中的“WebExtension :: executeScript:内容脚本注入VM149:1”