9

ボタンをクリックしてユーザーダッシュボードにリダイレクトするテストがあります。これはwebdriverを返すが発生した場合: javascript error: document unloaded while waiting for result.分度器/ Webdriverでページリダイレクトを待つ

を私はリダイレクトが発生した時点でbrowser.sleep(2000)を挿入し、私のCPUの使用率が低いと仮定すると、この問題を解決するには、この問題を解決します。しかし、2000ミリ秒は任意で遅いです。 expect(..)の前にリダイレクトされたページに角度がロードされるのを待つようなものがありますか?browser.waitForAngular()

it('should create a new user',() => { 
 
    $signUp.click(); 
 
    $email.sendKeys((new Date().getTime()) + '@.com'); 
 
    $password.sendKeys('12345'); 
 
    $submit.click(); 
 

 
    browser.sleep(2000); // Need alternative to sleep... 
 

 
    // This doesn't do it... 
 
    // browser.sleep(1); 
 
    // browser.waitForAngular(); 
 

 
    $body.evaluate('user') 
 
    .then((user) => { 
 
    expect(user).toBe(true); 
 
    }); 
 
});

答えて

11

あなたはこのような何かがあなたのために働くことができると思いますか?これは、「pageTwo」テキストが含まれるように、URLのための10秒まで待つか、またはものは何でも入れます。

var nextPageButton = $('#nextPage'); 
nextPageButton.click().then(function(){ 
    return browser.driver.wait(function() { 
     return browser.driver.getCurrentUrl().then(function(url) { 
     return /pageTwo/.test(url); 
     }); 
    }, 10000); 
}; 

ちょうどあなたが期待しているURLの正規表現に固執します。

代わりに、あなたにも表示されるように、次のページから要素を待つこともできます.clickを使用している場合

var nextPageButton = $('#nextPage'); 
nextPageButton.click(); 

var elementFromSecondPage = $('#coolElement'); 
browser.wait(protractor.until.elementIsVisible(elementFromSecondPage), 5000, 'Error: Element did not display within 5 seconds'); 

、分度器は当然のような、クリックに添付アクションを完了するために、角度を待ちますページを変更します。しかし、ページが変更されている間は、まだロードする特定のものが必要な場合があります。そのため、その部分が利用可能になる前にテストが失敗します。これを使用して、クリック部分が終了するのを待ってから、要素が表示されるのを待ちます。

4

user2020347の回答を展開する: ありがとうございました。私の問題を解決しました。なぜこれは組み込み関数ではないのだろうか。私はブラウザのナビゲーションを待つためにこれを多くの場所で使用します。

それをより簡潔にするために、私は少しヘルパー製:私のテストでは

Object.assign(global, { 
    waitUntilURLContains: string => { 
    let fn =() => { 
     return browser.driver.wait(() => { 
     return browser.driver.getCurrentUrl().then((url) => { 
      return url.includes(string); 
     }); 
     }, waitDelay); 
    } 

    return fn.bind(null, string); 
    } 
}); 

を:

$button.click().then(waitUntilURLContains('dashboard')); 
+0

これは実際にはその後、チェックbrowser.getのようにロードを完了するためにページを待つのだろうか?私はこれが現在のURLの入力文字列を探しているだけだと心配しました。 – jgritten

1

は非常に単純な、それを維持します。私も同じ問題に実行しているが、次のコードを使用して、それを解決することができた。

 page.setUsername(objectrepository.userdetails.useremail); 
     page.setPassword(objectrepository.userdetails.userpassword); 
     page.login().click(); 
     **browser.wait(EC.visibilityOf(page.greetingMessageElement()), 5000);** 

     page.greetingMessageElement().getText() 
     .then(function (value){ 
     expect(browser.getCurrentUrl()).toContain("#/mytickets"); 
     }); 
+0

toContainは私のために働いた:)ありがとう! –

関連する問題