2017-12-18 117 views
0

我想讓我的腳本等待,直到網頁完全加載爲此,我正在使用JavaScript表達式「window.document.readyState」它將如果頁面完全加載,則返回「完整」。browser.executeScript(返回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不解決任何成功或錯誤。執行停在這一行。而一段時間之後,給出以下eror: 致命錯誤:CALL_AND_RETRY_LAST分配失敗 - 的JavaScript堆出來的內存

+0

這很可能是因爲您正在同步循環內調用異步方法('executeScript')。 –

+0

@Florent B,這將是什麼解決方案?謝謝。 –

+0

看看[browser.wait](http://www.protractortest.org/#/api?view=webdriver.WebDriver.prototype.wait)。注意,等待'complete'狀態是無用的,因爲驅動程序默認已經在等待這個狀態。 –

回答

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

此功能將等待30000ms爲h1包含指定pageTitle文本類型的元素。根據您的情況進行適當更改,然後在繼續之前致電WaitforPage('title')

+0

謝謝。我會執行相同的。 –

0

實際上,webdriver的這種類型的等待已經開箱即用。不太清楚爲什麼你需要實現自己的池和等待文檔就緒狀態。

如果你使用一些AngularJS/ReactJS或其他SPA應用程序 - 這種等待將不會給你什麼,因爲在這樣的應用程序中,所有的工作都是在頁面加載完成並且js開始執行之後完成的。

我寧願使用關於使用browser.wait()來顯示某些特定元素的@ m-hudson建議。