Nightwatch升级至1.0.6后waitForAttribute()报错求助
waitForAttribute()报错client.assertion is not a function的问题 你遇到的这个问题是Nightwatch从0.9.x升级到1.x版本后的常见兼容性问题——Nightwatch 1.x彻底重构了内部的断言API,移除了旧版里的client.assertion方法,但你使用的nightwatch-custom-commands-assertions包中的waitForAttribute命令还在依赖这个废弃的API,所以才会抛出这个类型错误。
下面给你几个靠谱的解决思路:
1. 优先升级第三方命令包
首先试试更新你用的这个自定义命令包,看开发者有没有推出适配Nightwatch 1.x的版本:
npm update nightwatch-custom-commands-assertions
如果更新后问题消失,那就是最省事的解决方式。要是更新后还是不行,可以去这个包的仓库看看有没有针对Nightwatch 1.x的分支或者修复补丁。
2. 手动修改自定义命令的代码
如果第三方包没有更新,你可以自己动手修改node_modules/nightwatch-custom-commands-assertions/js/commands/waitForAttribute.js里的错误代码:
找到报错的第100行,把_this2.client.assertion(...)的调用替换成Nightwatch 1.x支持的断言方式,比如用this.assert对象的方法:
// 替换原来的client.assertion调用 _this2.assert.ok( yourCondition, // 原来的判断条件 errorMessage, // 断言失败时的提示信息 expectedValue, // 属性的预期值 actualValue, // 实际获取到的属性值 abortOnFailure, // 是否在断言失败时终止测试 stackTrace // 堆栈跟踪信息 );
记得根据原代码的逻辑调整参数,保证断言的行为和原来一致。
3. 用Nightwatch 1.x内置API替代自定义命令
其实Nightwatch 1.x本身提供了更灵活的waitUntil命令,你完全可以不用第三方包,自己实现waitForAttribute的功能:
browser.waitUntil(function() { // 这里的this指向当前的browser实例 return this.getAttribute('.csselement', '你要等待的属性名').then(function(attrValue) { // 替换成你需要的判断逻辑,比如属性值等于某个预期值 return attrValue === '预期的属性值'; }); }, { timeout: 5000, // 超时时间,单位毫秒 timeoutMsg: '超时:元素属性未达到预期状态' // 超时提示信息 });
这种方式更贴合Nightwatch 1.x的设计规范,也能避免第三方包带来的兼容性问题。
内容的提问来源于stack exchange,提问作者Aakanksha Agarwal

