分度器を使用して要素が表示されるかどうかをテストしようとしています。要素は次のようになります。
<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.
なぜこれが無効なのですか?分度器を使用して可視性を確認するにはどうすればよいですか?
これはそれを行う必要があります:
expect($('[ng-show=saving].icon-spin').isDisplayed()).toBe(true);
分度器の$
はjQueryではなく、:visible
はyet利用可能なCSSセレクター+疑似セレクター の一部ではないことに注意してください
分度器で要素の可視性をチェックする正しい方法は、 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
同様の問題がありました。ページオブジェクトに表示されるリターン要素のみが必要でした。 CSS :not
を使用できることがわかりました。この問題の場合、これはあなたをする必要があります...
expect($('i.icon-spinner:not(.ng-hide)').isDisplayed()).toBeTruthy();
ページオブジェクトのコンテキストでは、この方法で表示される要素のみを取得できます。例えば。複数のアイテムがあり、一部のみが表示されるページがある場合、次を使用できます。
this.visibileIcons = $$('i.icon:not(.ng-hide)');
これにより、すべての可視のi.icon
sが返されます
DOMに同じクラス名の要素が複数ある場合。ただし、1つの要素のみが表示されます。
element.all(by.css('.text-input-input')).filter(function(ele){
return ele.isDisplayed();
}).then(function(filteredElement){
filteredElement[0].click();
});
この例では、フィルターは要素のコレクションを取得し、isDisplayed()を使用して単一の可視要素を返します。
この回答は、ページ上にない要素に対して機能するのに十分堅牢であるため、セレクターが要素を見つけられなかった場合、正常に失敗します(例外をスローしません)。
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()
})
})
可視性を待つ
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"]))
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");
})
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);
});