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

运行本地移动端自动化测试时'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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:42:05