参照Nightwatch官方文档总结了一些常用技巧
元素选择器
- 选择器的附加选项
定位元素可以说是最常用的功能了。Nightwatch默认使用CSS选择器,也可以切换成Xpath。
官方给出的附加选项有以下几种:
- selector:选择器语法
- locateStrategy:使用的选择器种类,可以代入'xpath','css selector'([全部的选项参考此处](https://www.w3.org/TR/webdriver/#locator-strategies))
## 切换选择器的方法还有一种就是使用useXpath()或useCss()
- index:返回复数元素里的第几个元素,默认返回第一个
- abortOnFailure:用在waitForElement*类Api上。如果设置为False,当waitForElement*失败时能够忽略Error继续下一个测试。默认值True
## 如果希望全局都忽略同类Error,可以在nightwatch.json里设置abortOnAssertionFailure:False
- timeout:设置超时时间。用在waitForElement*类Api上。同样可以全局设置waitForConditionTimeout
- retryInterval:重试次数。用在waitForElement*类Api上。
- suppressNotFoundErrors:和abortOnFailure类似,可以忽略Error继续下一步测试,但设置值与abortOnFailure相反,默认为False,设置为True时可以跳过Error。
用在click(),getText()等可能会抛出NoSuchElement error(元素不存在)的Api上。
选择器不加选项时,使用方法和selenium的find_elements_by_XXX类Api类似,将selector直接传递给waitForElement*,click()等Api。
但是如果想要使用上述其他选项,需要将selector和其他选项打包成一个object。
module.exports = {
'Demo test': function (browser) {
browser.
// 最简单的元素选择
.waitForElementVisible('input[type=search]')
// 与上面那行是一个意思
.waitForElementVisible({selector:'input[type=search]'})
// 增加了index的选项
.waitForElementVisible({selector:'input[type=search]',index:2})
// 增加了选择器改成xpath的选项(下一个步骤默认值还是CSS选择器)
.waitForElementVisible({selector:'//input[text()=login]',locateStrategy:'Xpath'})
.useXpath() // 之后的选择器都默认变成Xpath
// 如果条件里有中文,需要加上双引号
.waitForElementVisible(//input[text()="登录"]')
// 用“,”分割的不是选择器的选项,而是waitForElementVisible()自身的选项
.waitForElementVisible({selector:'//input[text()=login]',locateStrategy:'Xpath'}, 1000, false, function() {}, '输出Log:选择器%s 时间%d ms')
}
};
各种Api的附加选项
- 附加选项的语法
以waitForElementVisible()为例,有time,poll,callback等选项。
官方给出的附加选项有以下几种:
- using:string,使用的选择器种类(相当于上述的locateStrategy)
- selector:string或Object,选择器语法
- time:number,设置超时时间。用在waitForElement*类Api上。同样可以全局设置waitForConditionTimeout
- poll:number,重试次数。用在waitForElement*类Api上。
- abortOnFailure:boolean,用在waitForElement*类Api上。如果设置为False,当waitForElement*失败时能够忽略Error继续下一个测试。默认值True
## 如果希望全局都忽略同类Error,可以在nightwatch.json里设置abortOnAssertionFailure:False
- callback:function,Api执行结束后执行的function
- message:string,Api执行时输出的log
如果想要添加一个Api执行完毕后的callback,因为callback是选项中唯一一个function类型,只需要直接在选择器后面添加一个function就会默认作为callback执行。
但是例如time(超时)和poll(重试回数)都是number,当想要定义poll时,必须先在前面加上time选项。
module.exports = {
'Demo test': function (browser) {
browser.
// 添加callback,result是选择器返回的元素list
.waitForElementVisible('input[type=search]',function(result)=>{})
// 第一个number会被作为time,第二个number才会被作为poll
.waitForElementVisible('input[type=search]',1000,5,function(result)=>{})
// 选择器之后的最后一个string只会被当成message
.waitForElementVisible('input[type=search]','output msg')
// 第一个string如果作为选择器种类能够成立,就会被作为using,从第二个string开始找selector
.waitForElementVisible('css selector', '#index-container')
}
};
可以看到,像超时设定这种选项会在全局设置,选择器和Api的选项里重复出现。
当同一个设定重复被定义时,优先级别如下:
全局设定(写在nightwatch.json里的设置)>选择器的选项>Api的选项