web-dev-qa-db-ja.com

Nightwatchjs:エラー/失敗/例外を作成せずに要素が存在するかどうかを確認する方法

私がテストしているページには、BASICまたはADVANCEDの2つのボタンが表示される場合があります。

ADVANCEDボタンが表示されているかどうかを確認したい場合は、クリックします。

BASICボタンが表示されている場合、何もせずにテストを続行します。

私が試したNightwatchjsのすべてのオプションは、失敗メッセージを生成します。たとえば、「waitforpresent」または「waitforvisible」でボタンが存在しない場合、エラー/失敗が生成されます。どのボタンが存在するかを知りたいので、コードで決定を下すことができます。

ここに私が試したものがあります:

try { 
    browser.isVisible('#advanced-search', function(result) {console.log(result.state); }) 
} catch (myError) 
{ 
    console.log(myError); 
}

考え?

19
Aaron Kuehn

これを実現するには、 Selenium protocol "element" とコールバック関数を使用して結果ステータスをチェックし、要素が見つかったかどうかを判断します。例えば:

browser.element('css selector', '#advanced-search', function(result){
    if(result.status != -1){
        //Element exists, do something
    } else{
        //Element does not exist, do something else
    }
});
15
EricM

あなたはisVisibleで正しい軌道に乗っているようです。ナイトウォッチ ドキュメント から、コールバックでresult.valueプロパティをチェックして、要素が表示されているかどうかを確認できることがわかります。

browser.isVisible('#advanced-search', results => {
  if (results.value) { /* is visible */ }
  else { /* is not visible */ }
});

または、Saifurが提案するアプローチを使用することもできます。 Selenium APIの.elementsコマンドを呼び出して、結果の配列の長さを確認します。

browser.elements('css selector', '#advanced-search', results => {
  if (results.value.length > 0) { /* element exists */ }
  else { /* element does not exist */ }
});

実際、これは カスタムコマンド にラップできます。

// isPresent.js
module.exports.command = function (selector, callback) {
  return this.elements('css selector', selector, results => {
    if (results.status !== 0) { // some error occurred, handle accordingly
    }

    callback(results.value.length > 0);
  });
};

通常のコードでは、次のように呼び出すことができます。

browser.isPresent('#advanced-search', advancedSearchPresent => {
  // make decisions here
}

コールバックで追加のAPI呼び出しを行う場合は、.perform呼び出しですべてをラップするのが賢明かもしれません。

browser.perform((_, done) => {
  browser.isPresent('#advanced-search', advancedSearchPresent => {

    // ...do more stuff...

    done();
  });
});

.performが必要な理由については、 this が役立つ場合があります。

5
dwoodwardgb

私のチームは、1つの関数を使用していくつかの異なるサインインフォームで認証を行い、ifElementExistsというカスタムコマンドを使用して、どのフォームを使用しているかを理解するための分岐ロジックを実現します。また、現在の状態を判別するためのより良い方法がない他のいくつかのページでこれを使用します。

import { CustomCommandShorthand } from './customCommands';
import { isFunction } from 'lodash';

exports.command = function ifElementExists(this: CustomCommandShorthand, selector: string, ifTrue: Function, ifFalse?: Function) {
    this.perform(() => {
        if (!isFunction(ifTrue)) {
            throw new Error(`The second argument must be callable. You passed a ${typeof ifTrue} instead of a function.`);
        }

        this.element('css selector', selector, function ifElementExistsCallback({ status }) {
            if (status !== -1) {
                return ifTrue();
            }

            if (isFunction(ifFalse)) {
                ifFalse();
            }
        });
    })
}
1
SgtPooki

構文は少しずれている可能性があります。 NightWatchJSにあまり詳しくない。ただし、概念は同じままです。

//I would not wait for a element that should not exist
//rather I would find the list of the element and see if the count is greater than 0
//and if so, we know the element exists
browser.findElements(webdriver.By.css('#advanced-search')).then(function(elements){
    if(elements.length> 0){
        console.log(elements.length);
    }
});

他の例を参照してください here

1
Saifur