web-dev-qa-db-ja.com

分度器:ボタンをクリックした後にページが完了するのを待つ方法は?

テスト仕様では、Webページのボタンをクリックして、新しいページが完全にロードされるのを待つ必要があります。

emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');

btnLoginEl.click();

// ...Here need to wait for page complete... How?

ptor.waitForAngular();
expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');
69
Zach

あなたがしたいことに応じて、あなたは試すことができます:

browser.waitForAngular();

または

btnLoginEl.click().then(function() {
  // do some stuff 
}); 

約束を解決するために。 beforeEachでそれができればもっといいでしょう。

NB:expect()は、比較する前に内部のpromise(つまりgetCurrentUrl)が解決されるのを待っていることに気付きました

81
glepretre

ソースを見たところです-分度器はAngularを少数のケースでのみ待機しています(element.allが呼び出されたとき、または位置を設定/取得したときなど)。

したがって、分度器は、コマンドごとにAngularが安定するのを待ちません。

また、私のテストではAngularダイジェストサイクルとクリックイベントの間に競合があったようです。

Elm.click();
browser.driver.sleep(1000);
browser.waitForAngular();

スリープを使用して、AngularJSコンテキストに入る実行を待機します(clickイベントによってトリガーされます)。

26
Filip Sobczak

待つ必要はありません。分度器はangularの準備が整うまで自動的に待機し、制御フローの次のステップを実行します。

25
Andres D

分度器では、次のアプローチを使用できます

var EC = protractor.ExpectedConditions;
// Wait for new page url to contain newPageName
browser.wait(EC.urlContains('newPageName'), 10000);

したがって、コードは次のようになります。

emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');

btnLoginEl.click();

var EC = protractor.ExpectedConditions;
// Wait for new page url to contain efg
ptor.wait(EC.urlContains('efg'), 10000);

expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');

注:これは、新しいページの読み込みが完了し、DOMの準備が整ったことを意味しない場合があります。後続の「expect()」ステートメントは、ProtractorがDOMがテストに使用できるようになるまで待機することを保証します。

参照: 分度器の期待される条件

4
milan pandya

この場合、次を使用できます。

ページオブジェクト:

    waitForURLContain(urlExpected: string, timeout: number) {
        try {
            const condition = browser.ExpectedConditions;
            browser.wait(condition.urlContains(urlExpected), timeout);
        } catch (e) {
            console.error('URL not contain text.', e);
        };
    }

ページテスト:

page.waitForURLContain('abc#/efg', 30000);
3
Dao Minh Dam

私は通常、制御フローに何かを追加するだけです:

it('should navigate to the logfile page when attempting ' +
   'to access the user login page, after logging in', function() {
  userLoginPage.login(true);
  userLoginPage.get();
  logfilePage.expectLogfilePage();
});

logfilePage:

function login() {
  element(by.buttonText('Login')).click();

  // Adding this to the control flow will ensure the resulting page is loaded before moving on
  browser.getLocationAbsUrl();
}
2
Justin Helmer

これを使用する方が良いと思います

   *isAngularSite(false);*
    browser.get(crmUrl);


    login.username.sendKeys(username);
    login.password.sendKeys(password);
    login.submit.click();

    *isAngularSite(true);*

IsAngularSiteのこの設定を使用するには、これをprotractor.conf.jsに次のように配置する必要があります。

        global.isAngularSite = function(flag) {
        browser.ignoreSynchronization = !flag;
        };
1
Dantinho

このようなことができます

emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');

btnLoginEl.click().then(function(){
browser.wait(5000);
});
0
ashish bansal