Nightwatchjs:如何在不创建错误/失败/异常的情况下检查元素是否存在

时间:2015-07-28 21:02:50

标签: selenium automated-tests nightwatch.js

在我测试的页面中,可能会显示两个按钮:BASIC或ADVANCED。

我希望能够判断ADVANCED按钮是否显示 - 如果是,请单击它。

如果显示BASIC按钮,我想什么都不做,继续我的测试。

我尝试过的所有Nightwatchjs选项都会生成失败消息。例如,如果我" waitforpresent"或" waitforvisible"并且按钮不存在,它会生成错误/失败。我只是想知道哪个按钮存在,所以我可以在我的代码中做出决定。

以下是我的尝试:

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

思想?

4 个答案:

答案 0 :(得分:13)

您可以使用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
    }
});

答案 1 :(得分:5)

你似乎与isVisible在正确的轨道上。从夜间守望documentation,我们看到在回调中您可以检查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 */ }
});

这实际上可以包含在custom command

// 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可能会有所帮助。

答案 2 :(得分:1)

语法可能很少。对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

答案 3 :(得分: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();
            }
        });
    })
}