我在使用Selenium执行脚本时遇到超时,无论我尝试做什么都可以避免它们。
我首先将超时设置为可笑的长度:
_driver.Manage().Timeouts().SetScriptTimeout(TimeSpan.FromMinutes(30));
_driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromMinutes(30));
稍后,我运行一个预计需要很长时间的脚本(它正在执行一个长时间运行的POST请求)。无论我使用ExecuteScript
还是ExecuteAsyncScript
,请求都会在60秒时超时。
我能做些什么来避免这种情况吗?即使是黑客或解决方法在这一点上也会很好。
答案 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)
您最喜欢的RemoteWebDriver
(FireFoxDriver
或ChromeDriver
)在其某些构造函数重载中采用commandTimeout
参数。
_driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), new ChromeOptions(), TimeSpan.FromMinutes(30))
在构造实例后似乎无法更改此设置,因此您需要确保以这种方式设置它。这样可以防止超时。