web-dev-qa-db-ja.com

分度器を使用して要素が表示されているかどうかを確認する方法は?

分度器を使用して要素が表示されるかどうかをテストしようとしています。要素は次のようになります。

<i class="icon-spinner icon-spin ng-hide" ng-show="saving"></i>

chromeコンソールでは、このjQueryセレクターを使用して、要素が表示されているかどうかをテストできます。

$('[ng-show=saving].icon-spin')
[
<i class=​"icon-spinner icon-spin ng-hide" ng-show=​"saving">​</i>​
]
> $('[ng-show=saving].icon-spin:visible')
[]

ただし、分度器で同じことをしようとすると、実行時にこのエラーが発生します。

InvalidElementStateError: 
invalid element state: Failed to execute 'querySelectorAll' on 'Document': 
'[ng-show=saving].icon-spin:visible' is not a valid selector.

なぜこれが無効なのですか?分度器を使用して可視性を確認するにはどうすればよいですか?

104
limp_chimp

これはそれを行う必要があります:

expect($('[ng-show=saving].icon-spin').isDisplayed()).toBe(true);

分度器の$はjQueryではなく、:visibleyet利用可能なCSSセレクター+疑似セレクター の一部ではないことに注意してください

詳細は https://stackoverflow.com/a/13388700/511069

138
Leo Gallucci

分度器で要素の可視性をチェックする正しい方法は、 isDisplayed メソッドを呼び出すことです。ただし、isDisplayedはブール値を返さず、評価された可視性を提供するpromiseを返すため、注意が必要です。このメソッドを誤って使用しているため、実際の可視性を評価しないコード例がたくさんあります。

要素の可視性を取得する例:

element(by.className('your-class-name')).isDisplayed().then(function (isVisible) {
    if (isVisible) {
        // element is visible
    } else {
        // element is not visible
    }
});

ただし、分度器はJasmine expect()にパッチを適用するため、要素の可視性を(取得するのではなく)単にチェックしている場合は、Promiseが解決されるまで常に待機するため、これは必要ありません。 github.com/angular/jasminewd を参照してください

だからあなたはちょうどすることができます:

expect(element(by.className('your-class-name')).isDisplayed()).toBeTruthy();

AngularJSを使用してその要素の可視性を制御しているため、次のようにng-hideのクラス属性を確認することもできます。

var spinner = element.by.css('i.icon-spin');
expect(spinner.getAttribute('class')).not.toMatch('ng-hide'); // expect element to be visible
75
Mobiletainment

同様の問題がありました。ページオブジェクトに表示されるリターン要素のみが必要でした。 CSS :notを使用できることがわかりました。この問題の場合、これはあなたをする必要があります...

expect($('i.icon-spinner:not(.ng-hide)').isDisplayed()).toBeTruthy();

ページオブジェクトのコンテキストでは、この方法で表示される要素のみを取得できます。例えば。複数のアイテムがあり、一部のみが表示されるページがある場合、次を使用できます。

this.visibileIcons = $$('i.icon:not(.ng-hide)'); 

これにより、すべての可視のi.iconsが返されます

8
Brine

DOMに同じクラス名の要素が複数ある場合。ただし、1つの要素のみが表示されます。

element.all(by.css('.text-input-input')).filter(function(ele){
        return ele.isDisplayed();
    }).then(function(filteredElement){
        filteredElement[0].click();
    });

この例では、フィルターは要素のコレクションを取得し、isDisplayed()を使用して単一の可視要素を返します。

5

この回答は、ページ上にない要素に対して機能するのに十分堅牢であるため、セレクターが要素を見つけられなかった場合、正常に失敗します(例外をスローしません)。

const nameSelector = '[data-automation="name-input"]';
const nameInputIsDisplayed = () => {
    return $$(nameSelector).count()
        .then(count => count !== 0)
}
it('should be displayed', () => {
    nameInputIsDisplayed().then(isDisplayed => {
        expect(isDisplayed).toBeTruthy()
    })
})
1
activedecay

可視性を待つ

const EC = protractor.ExpectedConditions;
browser.wait(EC.visibilityOf(element(by.css('.icon-spinner icon-spin ng-hide')))).then(function() {
  //do stuff
})

可視要素のみを見つけるXpathトリック

element(by.xpath('//i[not(contains(@style,"display:none")) and @class="icon-spinner icon-spin ng-hide"]))
1
Drew Royster
 element(by.className('your-class-name')).isDisplayed().then(function (isVisible) {
if (isVisible) {
    // element is visible
} else {
    // element is not visible
}
}).catch(function(err){
console.log("Element is not found");
})
1
Anil Kumar

TypeScript、分度器、ジャスミンを使用するフレームワークに使用できるいくつかのコードスニペットを以下に示します。

browser.wait(until.visibilityOf(OversightAutomationOR.lblContentModal), 3000, "Modal text is present");

//テキストのアサート

OversightAutomationOR.lblContentModal.getText().then(text => {
                    this.assertEquals(text.toString().trim(), AdminPanelData.lblContentModal);
                });

//要素のアサート

expect(OnboardingFormsOR.masterFormActionCloneBtn.isDisplayed()).to.eventually.equal(true

    );

OnboardingFormsOR.customFormActionViewBtn.isDisplayed().then((isDisplayed) => {
                        expect(isDisplayed).to.equal(true);
                });

//フォームのアサート

formInfoSection.getText().then((text) => {
                        const vendorInformationCount = text[0].split("\n");
                        let found = false;
                        for (let i = 0; i < vendorInformationCount.length; i++) {
                            if (vendorInformationCount[i] === customLabel) {
                                found = true;
                            };
                        };
                        expect(found).to.equal(true);
                    });     
0
Khyati Sehgal