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

WebdriverIO+Appium+TypeScript测试Android应用遇匹配器错误求助

Android自动化测试问题排查与解决

环境信息

  • Node.js: v18.5.0
  • TypeScript: v4.9.5
  • WebdriverIO: ^8.7.0
  • Appium: ^1.22.3
  • Mocha: ^10.2.0
  • 操作系统: Windows 10 Enterprise

package.json 配置

{...
    "dependencies": {
        "@capacitor-community/bluetooth-le": "^2.1.0",
        "@capacitor/android": "4.6.3",
        "@capacitor/app": "4.1.1",
        "@capacitor/core": "4.6.3",
        "@capacitor/haptics": "4.1.0",
        "@capacitor/keyboard": "4.1.1",
        "@capacitor/status-bar": "4.1.1",
        "@ionic/react": "^6.0.0",
        "@ionic/react-router": "^6.0.0",
        "@testing-library/jest-dom": "^5.11.9",
        "@testing-library/react": "^13.3.0",
        "@testing-library/user-event": "^12.6.3",
        "@types/node": "^12.19.15",
        "@types/react": "^18.0.17",
        "@types/react-dom": "^18.0.6",
        "@types/react-router": "^5.1.11",
        "@types/react-router-dom": "^5.1.7",
        "ble-wrapper": "^1.0.7",
...
    },
...
    "eslintConfig": {
        "extends": [
            "react-app",
            "react-app/jest"
        ]
    },
        "development": [
            "last 1 chrome version",
            "last 1 firefox version",
            "last 1 safari version"
        ]
    },
    ...
    "devDependencies": {
        "@babel/cli": "^7.21.0",
        "@babel/core": "^7.21.4",
        "@babel/preset-env": "^7.21.4",
        "@babel/register": "^7.21.0",
        "@capacitor/cli": "^4.6.3",
        "@types/chai": "^4.3.4",
        "@types/jquery": "^3.5.16",
        "@types/mocha": "^10.0.1",
        "@types/web-bluetooth": "^0.0.16",
        "@types/webdriverio": "^5.0.0",
        "@wdio/allure-reporter": "^8.6.8",
        "@wdio/appium-service": "^8.7.0",
        "@wdio/cli": "^8.7.0",
        "@wdio/devtools-service": "^8.7.0",
        "@wdio/globals": "^8.6.9",
        "@wdio/local-runner": "^8.7.0",
        "@wdio/mocha-framework": "^8.7.0",
        "@wdio/spec-reporter": "^8.6.8",
        "@wdio/sync": "^7.27.0",
        "@wdio/types": "^8.6.8",
        "allure-commandline": "^2.21.0",
        "appium": "^1.22.3",
        "appium-uiautomator2-driver": "^2.14.0",
        "chai": "^4.3.7",
        "mocha": "^10.2.0",
        "ts-node": "^10.9.1",
        "typescript": "^4.9.5",
        "webdriverio": "^8.7.0"
    },
}

tsconfig.json 配置

{
  "compilerOptions": {
    "target": "es2022",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "commonjs",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx",
    "outDir": "./dist",
    "types": [
      "node",
      "mocha",
      "webdriverio/async",
      "@wdio/mocha-framework",
      "@wdio/globals/types",
      "@wdio/types"
    ]
  },
  "include": [
    "src"
  ],
  "exclude": [
    "node_modules"
  ]
}

测试代码

import { Browser } from 'webdriverio';

let device: Browser;

describe('Open and close drawer', async () => {
    it('Open drawer', async () => {
        await $('//*[@text="OPEN DRAWER"]').click();
        // await device.pause(3000);
        // const error = await $('//*[@resource-id="android:id/message"]')['error']
        if (await $('//*[@resource-id="android:id/message"]')) {
            await $('//*[@resource-id="android:id/button1"]').click()
        }
        expect($('alert-1-hdr')).toEqual("You've just clicked the Open Drawer button");
    });
});

测试报错信息

...
[9c000c72010648725d2 Android 11 #0-0] Unexpected return from a matcher function.
Matcher functions should return an object in the following format:
  {message?: string | function, pass: boolean}
'{"actual": {}, "expected": "You've just clicked the Open Drawer button", "message": [Function anonymous], "name": "toEqual", "pass": {}}' was returned
...

遇到的问题

  • device变量无法执行pause等操作
  • 测试代码表现出类似jQuery语法的行为,而非WebdriverIO预期语法
  • 出现匹配器函数返回格式错误的报错

解决方法

测试文件不在src目录下,将wdio.conf.ts和test目录添加到tsconfig.json的include字段后,问题解决。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:17:10