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
相关产品推荐
相关产品推荐

