You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:45:10