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

WebDriverIO结合Appium测试报ReferenceError: $ Not defined错误

问题修复方案

核心报错原因

  • 你当前用的是WebDriverIO Standalone 手动初始化客户端的模式,$快捷选择器不会被注入到全局作用域,直接写$('#xxx')必然触发ReferenceError: $ is not defined。只有用WDIO自带的Testrunner跑用例时,$才会作为全局方法可用。
  • 测试代码存在冗余会话创建逻辑:before钩子已经初始化了client连接,用例内部又重复调用webdriverio.remote()创建第二个会话,会导致会话状态混乱。
  • 选择器格式错误:直接传ID字符串给$时,WDIO默认会把它当成CSS选择器解析,不会自动识别为ID定位,自然触发无效选择器报错。
  • 异步方法未加await:click()是异步Promise方法,不加await会因为执行时序问题找不到元素。

修复后可运行代码

const webdriverio = require('webdriverio');
const androidOptions = require('../../helpers/caps').androidWebOptions;
const assert = require('chai').assert;
 
describe('Create Chrome web session', function () {
  let client;
 
  before(async function () {
    client = await webdriverio.remote(androidOptions);
  });
 
  after(async function () {
    return await client.deleteSession();
  });
 
  it('should create and destroy Android browser session', async function () {
    // 访问Google首页
    await client.url('https://www.google.com');
    const title = await client.getTitle();
    assert.equal(title, 'Google');

    // 调用client实例上的$方法,显式声明id定位前缀,加await等待操作执行
    await client.$('id=4ca7df34-c02a-4b70-8318-8382f2318a4a').click()
  });
});

额外优化建议

  • 如果你想直接用全局$的简写写法,不需要手动调用webdriverio.remote()初始化客户端,改用WDIO官方Testrunner执行测试即可,框架会自动把$、browser等常用对象注入全局作用域。
  • 你现在用的UUID格式元素ID是前端框架生成的动态ID,页面每次刷新都会变化,就算选择器写法正确,后续运行也大概率出现找不到元素的问题。Google首页的登录按钮是稳定元素,建议用文本、aria-label属性等稳定特征定位,比如中文环境下可以直接用await client.$('button=登录').click()定位,稳定性远高于动态ID。

内容的提问来源于stack exchange,提问作者0xI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:15:52