web-dev-qa-db-ja.com

要素が分度器でクリックできないかどうかを確認するにはどうすればよいですか?

要素が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.
    })
;
8
Seer

私はこれに有効な解決策を見つけました。 click()がpromiseを返すので、単純に.thenそれをオフにして、成功したクリックハンドラーをスローし、キャッチハンドラーをオーバーライドして何もしないようにします。これにより、要素がクリック可能でない場合にテストに合格します。

return this.shouldSeeDisabledFunds()
    .then(function() {
        fundsElem.first().click()
            .then(
                function() {
                    throw "Can click Funds element that should be disabled";
                },
                function() {}
            )
        ;
    })
;
9
Seer

あなたのケースには当てはまらないかもしれませんが、要素がクリック可能かどうかを確認するより良い方法は、要素が表示されて有効になっているかどうかを確認することです:elem.isDisplayed()elem.isEnabled()。これにより、必要のないときに誤ってボタンをクリックすることがなくなります。

Fyi、次のような場合に役立つライブラリがあります: https://github.com/angular/protractor/pull/17

3
hankduan

実際に確認する方法は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)分度器のisEnabledisDisplayed、および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;
     });
}
0
Jacek Góraj