Javascript 无法在量角器中解析browser.executeScript(返回窗口.document.readyState)
我想让我的脚本等待网页完全加载,我使用的是javascript表达式window.document.readyState,如果页面完全加载,它将返回completeJavascript 无法在量角器中解析browser.executeScript(返回窗口.document.readyState),javascript,protractor,Javascript,Protractor,我想让我的脚本等待网页完全加载,我使用的是javascript表达式window.document.readyState,如果页面完全加载,它将返回complete function waitForWebpageLoadingCompletely(callback) { try { var status="Incomplete"; do { var flag = browser.executeScript("return window.document.ready
function waitForWebpageLoadingCompletely(callback) {
try {
var status="Incomplete";
do {
var flag = browser.executeScript("return window.document.readyState ;");
//console.log(flag)
flag.then(function (state) {
console.log(state);
if(state==="complete")
callback();
else {
//status = "Incomplete";
console.log(state);
}
},function (err) {
console.log(err)
})
}while(!(status ==="complete"));
} catch (e) {
expect(false);
console.log(e);
callback();
}
}
但executeScript无法解决任何成功或错误。执行在这一行停止。一段时间后,它给出了以下eror:
致命错误:调用和重试上次分配失败-JavaScript堆内存不足您需要使用browser.wait-您在评论中提到需要等待页面标题,因此您需要编写如下内容:
var WaitForPage = function(pageTitle, timeout = 30000){
var deferred = promise.defer();
browser.waitForAngular().then(function(){
var el = element(by.cssContainingText('h1', pageTitle));
var EC = protractor.ExpectedConditions;
browser.wait(EC.presenceOf(el), timeout).then(function(){
deferred.fulfill();
});
});
return deferred.promise;
}
对于包含指定pageTitle文本的h1类型元素,此函数将等待30000ms。根据您的情况进行适当的更改,然后在继续之前调用WaitforPage'title'。实际上,webdriver已经完成了这种类型的等待。不太清楚为什么需要实现自己的池并等待文档就绪状态 如果您使用一些AngularJS/ReactJS或其他SPA应用程序,这种等待实际上不会给您任何帮助,因为在此类应用程序中,所有工作都是在页面加载和js开始执行之后完成的
我更愿意使用@m-hudson关于使用浏览器的建议。请等待某些特定元素出现。这可能是因为您正在同步循环中调用异步方法executeScript。@Florent B,对此有什么解决方案?谢谢。看一看。请注意,由于驱动程序在默认情况下已经在等待这个状态,所以等待完成状态是无用的。我真的对量角器的这个功能感到困惑,因为驱动程序在默认情况下会等待。我有一个场景,当我传递凭证并单击submit时,仪表板将加载。我只是想验证标题是否正确。当页面完全加载时,标题会正确显示。若驱动程序等待加载,则标题验证应始终通过,但在单击“提交”后,说明标题不匹配时失败。我正在使用回调使其同步。谢谢。我将实施同样的措施。