typescript - 如何设置 Appium-Webdriver.io-project 来编译 typescript 文件? [错误@wdio/cli :launcher: No specs found to run, 退出失败]

标签 typescript appium typescript-typings webdriver-io tsconfig

我想将我的 Appium-Javascript 样板转换为 typescript 项目。我更喜欢类型化配置,因为这是官方推荐的,并遵循 documentation 中提供的步骤。

这是项目的结构:

The project's structure

这是“package.json”文件:

{
  "author": "",
  "dependencies": {
    "@wdio/cli": "^6.5.2",
    "webdriverio": "^6.5.2",
    "ts-node": "^8.10.2",
    "typescript": "^3.9.5"
  },
  "devDependencies": {
    "@types/chai": "^4.2.12",
    "@types/mocha": "^8.0.3",
    "@types/node": "^14.11.2",
    "@types/selenium-webdriver": "^4.0.9",
    "@types/webdriverio": "^5.0.0",
    "@wdio/appium-service": "^6.4.7",
    "@wdio/cucumber-framework": "^6.5.0",
    "@wdio/local-runner": "^6.5.2",
    "@wdio/mocha-framework": "^6.5.0",
    "@wdio/selenium-standalone-service": "^6.4.7",
    "@wdio/spec-reporter": "^6.4.7",
    "@wdio/sync": "^6.5.0",
    "chai": "^4.2.0",
    "npm": "^6.14.8"
  },
  "license": "ISC",
  "main": "wdio.conf.js",
  "name": "android_e2e_appium",
  "scripts": {
    "wdio": "./node_modules/.bin/wdio",
    "pretest": "tsc",
    "test": "wdio ./build/wdio.conf.js"
  },
  "version": "1.0.0"
}

这是“tsconfig.json”文件(“sync-mode”配置):

{
  "compilerOptions": {
    "target": "ES2017",
    "module": "commonjs",
    "sourceMap": false,
    "outDir": "./build",
    "rootDir": "./src",
    "removeComments": true,
    "strict": true,
    "noImplicitAny": true,
    "moduleResolution": "node",
    "strictPropertyInitialization": true,
    "strictNullChecks": true,
    //"typeRoots": [ "./node_modules/@types" ],
    "types": [
      "node",
      "@wdio/sync",
      //"webdriverio",
      "@wdio/mocha-framework",
      "chai"
    ],
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "inlineSourceMap": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": [
    "./src/**/*.ts"
  ],
  "exclude": [
    "./node_modules",
    "plugins.ts"
  ]
}

这是“wdio.conf.ts”文件:

let {join} = require( 'path' );
exports.config = {
    runner: 'local',
    port: 4723,
    path: '/wd/hub',
    sync: true,
    specs: [
        './src/tests/**/*.js'
    ],
    exclude: [],
    maxInstances: 1,
    capabilities: [{
        'appium:platformName': 'Android',
        'appium:platformVersion': '8.1',
        'appium:deviceName': 'Nexus 6P',
        'appium:automationName': 'UiAutomator2',
        'appium:app': join( process.cwd(), './apk/ApiDemos-debug.apk' ),
        'appium:autoGrantPermissions': true,
        'appium:clearDeviceLogsOnStart': true,
        'appium:newCommandTimeout': 300000
    }],
    logLevel: 'error',
    bail: 0,
    waitforTimeout: 28000,
    connectionRetryTimeout: 90000,
    connectionRetryCount: 3,
    framework: 'mocha',
    reporters: ['spec'],
    mochaOpts: {
        //ui: 'bdd',
        timeout: 60000,
        //compilers:'tsconfig-paths/register'
        //compilers: ['ts:ts-node/register'],
        //requires: ['./test/helpers/common.js']
        require: ['ts-node/register']
    }
};

文件“sample.steps.ts”包含第一个测试来证明项目的功能:

import {expect} from 'chai';

describe('Sample test', () => {

    it("should verify that the text entry dialog username & password fields are editable", () => {
        let appBtn: any = $("~App");
        let alertDialogBtn: any = $('//android.widget.TextView[@content-desc="Alert Dialogs"]');
        let textEntryDialogBtn: any = $('//android.widget.Button[@content-desc="Text Entry dialog"]');
        let userNameField: any = $(
            '//android.widget.EditText[@resource-id="io.appium.android.apis:id/username_edit"]');
        let passwordField: any = $(
            '//android.widget.EditText[@resource-id="io.appium.android.apis:id/password_edit"]');

        appBtn.click();
        alertDialogBtn.click();
        textEntryDialogBtn.click();

        let testuser: string = "Test User";
        userNameField.addValue(testuser);
        passwordField.addValue("password");
        expect(userNameField.getText()).equal(testuser);
    });
});

我可以使用命令“tsc”将 typescript 从“./src”编译到“./build”文件夹(根据配置),不会出现任何错误。但是,当我运行测试时,我收到错误消息:

ERROR @wdio/cli:launcher: No specs found to run, exiting with failure

我很确定错误出现在“tsconfig.json”文件中,但我无法确定它。此时,即使是非类型化实现也可以; - 我无法实现其中任何一个。

我将项目推送到 github:appium-webdriverIO-typescript

最佳答案

This source provided the solution.

我终于能够通过运行带有标志--ignoreDeviceController的脚本来解决这个问题

此外,我将文件“wdio.conf”转换为 JavaScript 文件并将其移回项目的根级别。因此,文件“package.json”中的以下行必须相应更改:

"test": "wdio ./wdio.conf.js --ignoreDeviceController"

如果您仍然遇到此问题,请考虑添加以下附加标志:

--runType=realme

--relaxedSecurity

关于typescript - 如何设置 Appium-Webdriver.io-project 来编译 typescript 文件? [错误@wdio/cli :launcher: No specs found to run, 退出失败],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64089900/

相关文章:

angular - 没有任何声明模块的类型文件是否有意义?

types - 符号 (&) 在 TypeScript 类型定义中是什么意思?

ios - Appium Desktop 在启动 ios 模拟器后终止

android - 检查 WebView 元素时出现 UiAutomator 错误

java - 在 Android 设备上运行 appium 脚本时遇到问题

javascript - 在声明文件中描述 mixins

javascript - Angular PWA 更新太慢

javascript - 展开时的 Angular Dropdown 显示在屏幕底部

javascript - 在 typescript 中使用扩展运算符

TypeScript TupleIndexed 类型并强制只读作为参数传入的数组