要素がisクリック可能かどうかをProtractorでテストするのは簡単ですが、要素がnotクリック可能かどうかを確認する方法を見つけようとして頭を悩ませています。
クリック関数をtry/catchでラップして、クリックしようとしたときにエラーがスローされたときにそれをキャッチしてテストに合格するようにしました。ただし、これは機能しません。
チェックを行うメソッドのコードは次のとおりです。
return this.shouldSeeDisabledFunds()
.then(function() {
var clickable = true;
try {
fundsElem.first().click();
} catch (e) {
clickable = false;
console.log(clickable);
} finally {
console.log(clickable);
}
console.log(clickable);
// All the way through, clickable is still true, and the console log in the
// catch is not called. I believe this is because click is asynchronous.
})
;
私はこれに有効な解決策を見つけました。 click()
がpromiseを返すので、単純に.then
それをオフにして、成功したクリックハンドラーをスローし、キャッチハンドラーをオーバーライドして何もしないようにします。これにより、要素がクリック可能でない場合にテストに合格します。
return this.shouldSeeDisabledFunds()
.then(function() {
fundsElem.first().click()
.then(
function() {
throw "Can click Funds element that should be disabled";
},
function() {}
)
;
})
;
あなたのケースには当てはまらないかもしれませんが、要素がクリック可能かどうかを確認するより良い方法は、要素が表示されて有効になっているかどうかを確認することです:elem.isDisplayed()
とelem.isEnabled()
。これにより、必要のないときに誤ってボタンをクリックすることがなくなります。
Fyi、次のような場合に役立つライブラリがあります: https://github.com/angular/protractor/pull/17
実際に確認する方法は2つあります。
1)ExpectedConditions
を使用する
var EC = protractor.ExpectedConditions;
// Waits for the element with id 'abc' to not be clickable.
browser.wait(EC.not(EC.elementToBeClickable($('#abc'))), 5000);
クリック可能であることが判明した場合、エラーを返します。
2)分度器のisEnabled
、isDisplayed
、およびisPresent
を使用する
私の理解では、isNotClickable
を作成できます。これは、要素が存在するか、表示されるか、有効になっている場合にのみfalseを返し、それ以外の場合はtrueを返します。
function isNotClickable(element) {
return element.isPresent().then((isPresent) => {
if (isPresent) {
return element.isDisplayed().then((isDisplayed) => {
if (isDisplayed) {
return !element.isEnabled();
}
return true;
});
}
return true;
});
}