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

Aar*_*ehn 19 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); 
}
Run Code Online (Sandbox Code Playgroud)

思考?

小智 15

您可以通过使用Selenium协议"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
    }
});
Run Code Online (Sandbox Code Playgroud)


dwo*_*dgb 5

使用isVisible,您似乎走在正确的轨道上。从守夜文档中,我们看到在回调中,您可以检查result.value属性以查看元素是否可见,即:

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

或者,您可以使用Saifur建议的方法。调用selenium api的.elements命令,然后检查结果数组的长度:

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

实际上,这可以包装到自定义命令中

// 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);
  });
};
Run Code Online (Sandbox Code Playgroud)

那么在普通代码中,您可以这样称呼它:

browser.isPresent('#advanced-search', advancedSearchPresent => {
  // make decisions here
}
Run Code Online (Sandbox Code Playgroud)

如果您要在回调中进行其他api调用,将它们全部包装在.perform调用中可能是明智的:

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

    // ...do more stuff...

    done();
  });
});
Run Code Online (Sandbox Code Playgroud)

至于为什么.perform必须这样做,可能会有所帮助。


Sai*_*fur 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);
    }
});
Run Code Online (Sandbox Code Playgroud)

在这里查看更多示例