私がテストしているページには、BASICまたはADVANCEDの2つのボタンが表示される場合があります。
ADVANCEDボタンが表示されているかどうかを確認したい場合は、クリックします。
BASICボタンが表示されている場合、何もせずにテストを続行します。
私が試したNightwatchjsのすべてのオプションは、失敗メッセージを生成します。たとえば、「waitforpresent」または「waitforvisible」でボタンが存在しない場合、エラー/失敗が生成されます。どのボタンが存在するかを知りたいので、コードで決定を下すことができます。
ここに私が試したものがあります:
try {
browser.isVisible('#advanced-search', function(result) {console.log(result.state); })
} catch (myError)
{
console.log(myError);
}
考え?
これを実現するには、 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
}
});
あなたは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 が役立つ場合があります。
私のチームは、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();
}
});
})
}
構文は少しずれている可能性があります。 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