2017-12-18 11 views
0

ウェブページが完全に読み込まれるまで待機するスクリプトを作成したいのですが、javascript式 "window.document.readyState"を使用しています。ページが完全に読み込まれている場合は「完了」を返します。browser.executeScript(return 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下に示します: FATAL ERROR:CALL_AND_RETRY_LASTの割り当てが失敗しました -

+0

これは、同期ループ内で非同期メソッド( 'executeScript')を呼び出すためです。 –

+0

@Florent B、これにはどんな解決策がありますか?ありがとう。 –

+0

[browser.wait](http://www.protractortest.org/#/api?view=webdriver.WebDriver.prototype.wait)をご覧ください。ドライバがデフォルトで既にこの状態を待っているので、 'complete'状態を待つことは役に立たないことに注意してください。 –

答えて

1

あなたはbrowser.waitを使用する必要があるメモリのうちのJavaScriptヒープ - あなたはページのタイトルを待つために必要なあなたのコメントで述べたように、必要になりますので、このような何かを記述する必要があります。

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')に電話してください。

+0

ありがとうございます。私は同じものを実装します。 –

0

実際には、webdriverはすでにこのタイプの待機をしています。なぜ自分のプーリングを実装して、文書準備完了状態を待つ必要があるのか​​は不明です。

AngularJS/ReactJSや他のSPAアプリケーションを使用している場合、このようなアプリケーションでは、ページがロードされてjsが実行された後にすべての作業が行われるため、実際には何も表示されません。

いくつかの特定の要素を表示するには、browser.wait()を使用することについて、@ m-hudsonの提案を使用することをお勧めします。

関連する問題