运行本地移动端自动化测试时'onPrepare'钩子服务失败求助
问题排查:Appium服务启动失败与ES模块加载错误
环境配置
package.json
{ "name": "my-new-project", "type": "module", "devDependencies": { "@wdio/appium-service": "^8.11.2", "@wdio/cli": "^8.11.2", "@wdio/local-runner": "^8.11.2", "@wdio/mocha-framework": "^8.11.0", "@wdio/spec-reporter": "^8.11.2", "appium": "^2.0.0-rc.3", "appium-uiautomator2-driver": "^2.29.0" }, "scripts": { "wdio": "wdio run ./wdio.conf.js" } }
wdio.conf.js
export const config = { runner: 'local', port: 4724, path: '/', specs: [ './local_test.js' ], exclude: [ // 'path/to/excluded/files' ], maxInstances: 10, capabilities: [{ "platformName": "Android", "appium:platformVersion": "11", "appium:deviceName": "Redmi Note 11", "appium:automationName": "UIAutomator2", "appium:app": "C:\\VisualSC\\i_g_3_YT\\WikipediaSample.apk", "appium:udid": "my_udid", }], logLevel: 'error', bail: 0, baseUrl: 'http://localhost', waitforTimeout: 20000, connectionRetryTimeout: 120000, connectionRetryCount: 3, services: ['appium'], framework: 'mocha', reporters: ['spec'], mochaOpts: { ui: 'bdd', timeout: 60000 }, }
执行命令与错误信息
执行命令:
PS C:\VisualSC\i_g_3_YT> npm run wdio
错误输出:
2023-06-25T23:43:13.006Z ERROR @wdio/cli:utils: A service failed in the 'onPrepare' hook Error: Appium exited before timeout (exit code: 1) at ChildProcess.<anonymous> (file:///C:/VisualSC/i_g_3_YT/node_modules/@wdio/appium-service/build/launcher.js:116:22) at Object.onceWrapper (node:events:628:26) at ChildProcess.emit (node:events:513:28) at ChildProcess.emit (node:domain:489:12) at ChildProcess._handle.onexit (node:internal/child_process:291:12) Continue... [0-0] Error: "ts-node/esm/transpile-only 'resolve'" did not call the next hook in its chain and did not explicitly signal a short circuit. If this is intentional, include `shortCircuit: true` in the hook's return. [0-0] at new NodeError (node:internal/errors:399:5) [0-0] at ESMLoader.resolve (node:internal/modules/esm/loader:846:13) [0-0] at ESMLoader.getModuleJob (node:internal/modules/esm/loader:424:7) [0-0] FAILED Spec Files: 0 passed, 1 failed, 1 total (100% completed) in 00:00:07
问题分析与解决步骤
1. 修复ES模块加载错误
错误源于ts-node的ES模块解析钩子未正确配置,需添加shortCircuit: true声明:
- 在项目根目录创建
tsconfig.json,写入以下配置:{ "compilerOptions": { "module": "ESNext", "moduleResolution": "node", "target": "ES2020", "esModuleInterop": true }, "ts-node": { "esm": true, "experimentalSpecifierResolution": "node", "transpileOnly": true, "resolve": { "shortCircuit": true } } } - 或者修改package.json中的wdio启动命令,添加加载器配置参数:
"scripts": { "wdio": "node --loader ts-node/esm --experimental-specifier-resolution=node wdio run ./wdio.conf.js" }
2. 解决Appium服务启动失败问题
Appium退出码1通常是端口冲突或驱动安装异常:
- 关闭Appium GUI:若已打开Appium GUI,它会占用4724端口,导致WDIO的appium服务无法启动,关闭后重新执行命令。
- 重新安装Appium驱动:Appium 2.x要求用官方命令安装驱动,而非npm直接安装,执行以下命令:
npm uninstall appium-uiautomator2-driver appium driver install uiautomator2 - 更换端口:如果4724端口仍被占用,修改wdio.conf.js中的
port字段为其他未被占用的端口(比如4725)。
3. 验证修复
重新执行npm run wdio,检查错误是否消除,测试能否正常运行。
内容的提问来源于stack exchange,提问作者A. K.
相关产品推荐
相关产品推荐

