web-dev-qa-db-ja.com

非AngularページにProtractorを使用するときに、ページが読み込まれるのを待つ方法、または要素が存在するのを待つ方法

分度器は初めてです。 Angularページを扱うとき、私はこれを持っていると思いますが、Angular以外のページについては理解できません。何か助けていただければ幸いです。

describe('Search', function() {
   it('should click Search button and wait for results', function() {
      browser.driver.findElement(by.id('search')).click();
   });
});
6
gppanter

これを理解しました。クリックメソッドの後に、以下のコードを追加しただけです。

describe('Search', function() {
   it('should click Search button and wait for results', function() {
        browser.driver.findElement(by.id('search')).click();
        dvr.wait(function() {
            return dvr.isElementPresent(by.xpath(
                '/html/body/div/div[4]/div/div[2]/div/div/div/span'));
        }, 20000);
    });
});
3
gppanter

分度器で角度のないページをテストすることは、物事を待つことに関して難しい場合があります。

分度器を 最新 (現在は1.5.0)にアップグレードし、 カスタム関数waitReady() を使用して、準備ができている要素にbrowser.waitを使用し、テストを書き直すことをお勧めします。以下のように。必要に応じて、すべてを1つの仕様内に収めることができます。

// TODO: use page objects
var searchBtnElm = $('#search'); // use element(by.id('search')) if you prefer

it('waits for the elements present and visible (non-angular)', function() {
    expect(searchBtnElm.waitReady()).toBeTruthy();
});

it('should click Search button', function() {
    searchBtnElm.click();
});

it('wait for more results', function() {
    // keep using waitReady() before interacting with the elements
    // and before performing expectations on them
});

waitReadyここ の理由の詳細。

注:角度のないページをテストするには、同期を無視するように設定することを忘れないでください。

    browser.ignoreSynchronization = true;

角度のないページのbrowser.getの前に設定できます。

過去に高い暗黙の待機を設定することを提案しました。

browser.manage().timeouts().implicitlyWait(5000);

そのhackにより、waitReadyを回避し、標準を使い続けることができます

expect(searchBtnElm.isPresent()).toBeTruthy();

ただし、要素[〜#〜] not [〜#〜]が存在するかどうかをテストする場合、つまり、その場合、ベーンで5秒(5000ms)待機します。するとき

expect(someNonExistingElm.isPresent()).toBeFalsy();
15
Leo Gallucci

もう1つの優れたアプローチは、browser.wait内で「ExpectedConditions」を使用することです-次のようなものです。

var EC = protractor.ExpectedConditions;
var search = element(by.id('search'))
browser.wait(EC.visibilityOf(search), 2000).then(function(){
 search.click()
})

詳細については、こちらをご覧ください: https://angular.github.io/protractor/#/api?view=ExpectedConditions

1
Rajive Pai

分度器では、ページに2つのタイプの用語があります。 isPresent要素がページに存在するかどうかを尋ねます。 isDisplayedは、要素が表示されているかどうかを尋ねます。ページが読み込まれるのを待っている場合は、isDisplayedを待つ必要がありますが、ページが存在しない場合はエラーになるため、最初にisPresentを待ちます。関数を使用して要素を待機します。

function waitForElement(el, waitTimeoutMilliseconds){
    return browser.wait(function() { return el.isPresent(); }, waitTimeoutMilliseconds)
        .then(function(){
           return browser.wait(function() { return el.isDisplayed(); }, waitTimeoutMilliseconds);
        });
}

次に、テストでその関数を呼び出すだけです。

describe('Search', function() {
    it('should click Search button and wait for results', function() {
        var el = element(by.id('search'));
        waitForElement(el, 5000);
        el.click();
    });
});
1
mvndaai