Codeceptjs运行click时报selector需为string或function错误如何解决
问题原因
- CodeceptJS 自定义 Actor(通过
actor()方法生成的实例)初始化时只会识别挂载对象下的函数类型属性,你直接定义在返回对象中的普通属性buttons不会被挂载到实例this上,调用this.buttons实际返回undefined,进一步获取this.buttons.acceptcookie得到的也是undefined,最终传给click()方法的参数为空,触发 webdriverio 对选择器类型的校验报错。 - 代码中的 XPath 选择器、字符串参数误用了 HTML 转义实体
",JS 字符串中无需使用该类转义,直接书写双引号即可,否则即使能正常拿到选择器值也会因为格式错误无法定位元素。
修复方案
推荐选择以下任意一种方案修复:
方案1:选择器常量外移(更简洁)
将非方法类的常量移到 Actor 定义外部,作为模块内的常量直接调用,不受 CodeceptJS 的属性过滤规则影响:
let amazonWebKeys=require('./amazonKeys/amazonwebkeys.json'); // 选择器常量定义在模块作用域 const buttons = { acceptcookie : '//input[@id="sp-cc-accept"]' // 将"替换为正常双引号 } module.exports = function() { return actor({ getParemeters : function(keys){ return amazonWebKeys[keys]; }, WebTest:function(){ this.amOnPage(this.getParemeters("url")); // 替换转义字符为正常双引号 this.click(buttons.acceptcookie); // 直接调用模块内常量,无需通过this访问 } }); }
方案2:封装为方法返回选择器
如果需要将选择器挂载到 Actor 实例上,可以封装为函数类型的属性,CodeceptJS 会保留该类属性:
let amazonWebKeys=require('./amazonKeys/amazonwebkeys.json'); module.exports = function() { return actor({ // 封装为方法返回选择器对象 getButtons: function() { return { acceptcookie : '//input[@id="sp-cc-accept"]' } }, getParemeters : function(keys){ return amazonWebKeys[keys]; }, WebTest:function(){ this.amOnPage(this.getParemeters("url")); this.click(this.getButtons().acceptcookie); // 通过方法获取选择器 } }); }
修复后运行测试,click()方法会正常拿到字符串类型的选择器参数,报错即可消失。
内容的提问来源于stack exchange,提问作者Ronin Roni
相关产品推荐
相关产品推荐

