4

私の Angular アプリでは、ユーザーがページを開くと、最初にキャッシュされたコンテンツを読み込み、サーバーへの非同期呼び出しでフォローアップして、実際のデータをポーリングし、ページを更新します。既に表示されている要素にアクセスしようとしていますが、ページ コンテンツが更新されたため、その特定の要素は実際には何も変更されていませんが、要素のポインタが変更されています。

私はさまざまな解決策を試しましたが、それでも私が望むほど安定させることはできません。browser.wait を使いたくないので、try/catch ブロックのようなものが必要です。

説明から次のように見えます

browser.waitForAngular(); 

$http 呼び出しを処理する必要がありますが、役に立ちませんでした。

コードサンプルは次のとおりです。

    element(by.id('closeEditTagsModal')).click();
    helper.waitElementToDisappear(element(by.css('body[class$="modal-open"]')));
    element(by.id('myBookingsTab')).click();
    helper.waitElementToDisappear(element(by.css('body[class$="loading"]')));
    try {
           (helper.waitElementToBeShown(element(by.repeater('b in currentbookings').row(0)).element(by.cssContainingText('.tagPill', 'TestTag')))).then(function() {
        }, function(err) {
            console.log('element was not found');
            throw err;
        });
    }
    catch (err) {
        helper.waitElementToBeShown(element(by.repeater('b in currentbookings').row(0)).element(by.cssContainingText('.tagPill', 'TestTag')));
    }

これは、try/catch を使用しようとした別のサンプルですが、何か間違ったことをしたようです。try ブロックに次のエラーがあります。

StaleElementReferenceError: 要素が DOM に関連付けられていません

私のヘルプ機能のコード:

var waitElementToBeShown = function (elm) {
browser.wait(function () {
    return elm.isPresent();
},10000);
browser.wait(function () {
    return elm.isDisplayed();
},10000);
};

要素を操作できるようになるまで待機しようとしています。

4

1 に答える 1

0

への 2 つの呼び出し間で DOM が変更されるため、エラーがスローされていると思われますbrowser.wait。elementPromise を に渡す代わりに、browser.waitより間接的なものを渡す必要があります。ロケータを直接渡すことができます:

var waitElementToBeShown = function (elmLoc) {
  browser.wait(function () {
    return element(elmLoc).isPresent();
  },10000);
  browser.wait(function () {
    return element(elmLoc).isDisplayed();
  },10000);
}

しかし、常に単純なロケーター式があるとは限りません。要素を検索する関数を渡すことはできますか? そうすれば、ルックアップは待機ごとに再評価されます。

var waitElementToBeShown = function (elmFunc) {
  browser.wait(function () {
    return elmFunc().isPresent();
  },10000);
  browser.wait(function () {
    return elmFunc().isDisplayed();
  },10000);
}

次に、次のように呼び出すことができます。

waitElementToBeShown(function() {
  return element(by.repeater('b in currentbookings').row(0)).element(by.cssContainingText('.tagPill', 'TestTag')));
});

私はこの答えに完全に自信があるわけではありませんが、うまくいくようです...

于 2015-03-05T19:05:34.393 に答える