web-dev-qa-db-ja.com

分度器:存在するが表示されない要素を待機しています

要素が画面に表示されるかどうかを確認するためのテストを作成しました。私の場合、angular-ui-bootstrap折りたたみパネル、別名「警告」です。コードは機能しますが、テストは通常​​75%まで失敗します。

「警告」の表示に折りたたみアニメーションがあり、jqueryアニメーションであるため、テスト用のアニメーションをシャットダウンすることはできません。警告は常にDOM内に存在し、表示する理由がない場合は折りたたまれます。

最初は、このコードでテストしましたが、これは非常に簡単です。

_expect(element('.warning').isDisplayed()).toEqual(true);
_

要素がnotであることをテストする必要があるときに問題が発生しました。 :警告が表示されると、何らかのアクションによって警告が崩壊します。

そのテスト:

_expect(element('.warning').isDisplayed()).toEqual(false);
_

アニメーションが開始された場合のみ通過します。要素がまだ表示されている間に条件がチェックされると失敗します。

私は2つの解決策を考え出しました。

ptor.driver.sleep(2000)を使用する簡単な方法。テストが遅くなり、許容できません。

難しい、醜いものですが、良い結果が得られます。

_exports.isWarningDisplayed = function (expectedVisibility) {
  return ptor.driver.wait(function () {
     if (expectedVisibility) {
       return element(by.css('.warning')).isDisplayed().then(function(visibility) {
         return visibility === expectedVisibility;
       });
      } else {
        return element.all(by.css('.warning .collapse.in')).then(function(items) {
          return items.length === 0;
       });
      }
    }, 2000).then(function() {
      return element.all(by.css('.warning .collapse.in'));
    }).then(function (items) {
      return items.length > 0;
    });
};
_

私の問題は、それがひどく間違っていると感じていることです。その状況に対処するためのより良い方法を見つけましたか?私の期待は次のようなものになるでしょう:

_expect(element('.warning').not.isDisplayed()).toEqual(true);
_

...しかし、分度器やwebDriver AFAIKには_.not_はありません。

14
Julien Bérubé

私は同様の問題を抱えていました-要素が無効になったときをテストしたいです。私は.notテストなしで問題を回避しようと苦労しましたが、「not」テストをcssセレクターに移動するだけでよいことに気付きました。

// we're looking for when the element doesn't have a .disabled class
var availableElement = by.css('.some-class:not(.disabled)');
browser.wait(function() {
  return ptor.isElementPresent(availableElement);
}, 30000);

expect(ptor.isElementPresent(availableElement)).toBeTruthy();

それが役立つかどうかわかりませんが、私は明確にする瞬間があったので、共有したいと思いました。

18
mattgi

Elementexplorerを使用する( https://github.com/angular/protractor/blob/master/docs/debugging.md )分度器オブジェクトを見て、機能している回答を見つけました素晴らしく私にとって:

var el = element(by.id('visibleElementId'));
browser.driver.wait(protractor.until.elementIsNotVisible(el));
8
Al Joslin
expect(ptor.isElementPresent(by.css('.warning'))).toBe(false);

これは、ページに何かが表示されているかどうかを確認する別の方法です

2
Liam's musings

私の経験から、これは一般的な「悲しい」問題です。コードは適切に記述されていますが、待機が原因でテストは失敗しています。たとえば、Chrome=では、コンソールに次のエラーが表示されます:

<不明なエラー:要素はポイント(952、275)でクリックできません。 >

だから、私は私のWebDriverクラスに別の関数を作成し、それが機能しているようです:

this.waitElementToBeShown = function (elmLocator) {
        browser.sleep(500);
        browser.wait(function () {
            return (elmLocator).isPresent();
        }, 3000);
        browser.wait(function () {
            return (elmLocator).isDisplayed();
        }, 3000);
    }
0
Alex Svyatenko