browser.executeScript(return window.document.readyState)未在量角器中得到解决

时间:2017-12-18 12:15:40

标签: javascript protractor

我想让我的脚本等到网页完全加载,我正在使用javascript表达式“window.document.readyState”,如果完全加载页面将返回“完成”。

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并没有解决任何成功或错误。执行在此行停止。一段时间后,它给出了以下的错误: 致命错误:CALL_AND_RETRY_LAST分配失败 - JavaScript堆内存不足

2 个答案:

答案 0 :(得分:1)

您需要使用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;
}

对于包含指定h1文本的pageTitle类型元素,此函数将等待最多30000毫秒。根据您的具体情况进行适当更改,然后在继续之前致电WaitforPage('title')

答案 1 :(得分:0)

实际上,webdriver已经开箱即用。不太确定为什么需要实现自己的池并等待文档就绪状态。

如果你使用一些AngularJS / ReactJS或其他SPA应用程序 - 这个等待实际上什么也没有,因为在这样的应用程序中,所有的工作都是在加载页面并且js开始执行之后完成的。

我更倾向于使用@ m-hudson建议使用browser.wait()来显示某些特定元素。