在我测试的页面中,可能会显示两个按钮:BASIC或ADVANCED。
我希望能够判断ADVANCED按钮是否显示 - 如果是,请单击它。
如果显示BASIC按钮,我想什么都不做,继续我的测试。
我尝试过的所有Nightwatchjs选项都会生成失败消息。例如,如果我" waitforpresent"或" waitforvisible"并且按钮不存在,它会生成错误/失败。我只是想知道哪个按钮存在,所以我可以在我的代码中做出决定。
以下是我的尝试:
try {
browser.isVisible('#advanced-search', function(result) {console.log(result.state); })
} catch (myError)
{
console.log(myError);
}
思想?
答案 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();
}
});
})
}