コンテンツにスキップ

ビルディングドクターチェック

Appium Doctorの目的は、ドライバまたはプラグインの前提条件の設定をユーザーが支援することです。これらの前提条件は非常に複雑で、高度な技術知識を必要とする場合があります。拡張機能の作成者が作成するプレーンなNode.jsクラスインスタンスであるDoctorチェックは、診断と検出された問題の可能な修正を自動化することで、セットアッププロセスを簡素化します。これらのチェックは、より優れた使用体験を確保するためにインタラクティブになる可能性もあります。

このチュートリアルは、複雑なセットアップや構成の手順に対処するためにユーザーを支援したいプラグインまたはドライバの作成者を対象としています。

ドクターチェックの追加

型付けの要件

「ドクターチェック」という用語は、IDoctorCheckインターフェースを実装する単一のJavaScriptクラスインスタンスを文字通りに表します。このインターフェースは、次のメソッドとプロパティを定義します。

  • diagnose(): Promise<DoctorCheckResult>:考えられる問題を診断するコードが含まれています
  • fix(): Promise<string|null>hasAutofix()がtrueを返す場合は実際の問題を修正するか、手動修正の可能性についての文字列の説明を返します。このメソッドがFixSkippedErrorという例外をスローし、hasAutofix()がtrueを返すと、メソッド呼び出しの結果は無視されます。
  • hasAutofix(): booleanfix()を呼び出すと、検出された問題が解決するかどうか
  • isOptional(): boolean:検出された問題が無視でき、致命的な問題ではないかどうか
  • log: AppiumLogger:ログに使用できます。このプロパティは、インスタンス自体によって、または割り当てられていない場合はAppiumサーバーによって割り当てられる場合があります。

diagnose()メソッドによって返されるDoctorCheckResultオブジェクトには、次のプロパティが含まれている必要があります。

  • ok: boolean:診断で問題が検出されなかったかどうか
  • optional: boolean:診断された問題が無視しても安全かどうか
  • message: string:診断結果を説明するテキストメッセージ

マニフェストの要件

単一の拡張機能は、複数のドクターチェックをAppiumにエクスポートできます。対応する拡張機能がインストールされた後、これらのチェックがサーバーCLIによって適切に選択されるようにするには、以下の定義と同様に、package.jsonマニフェストのappium.doctor.checksセクションにリストされている必要があります。

  // ...
  "appium": {
    "driverName": "fake",
    "automationName": "Fake",
    "platformNames": [
      "Fake"
    ],
    "mainClass": "FakeDriver",
    "schema": "./build/lib/fake-driver-schema.js",
    "scripts": {
      "fake-error": "./build/lib/scripts/fake-error.js",
      "fake-success": "./build/lib/scripts/fake-success.js",
      "fake-stdin": "./build/lib/scripts/fake-stdin.js"
    },
    "doctor": {
      "checks": [
        "./doctor/fake1.js",
        "./doctor/fake2.js"
        // ...
      ]
    }
  },
  // ...

また、@appium/typesインポートをパッケージ開発依存関係に含めることをお勧めします。

実装例

以下の例は、トランスパイルを使用しない「生の」Node.JS実装です。

const {fs, doctor} = require('@appium/support');

/** @satisfies {import('@appium/types').IDoctorCheck} */
class EnvVarAndPathCheck {
  /**
   * @param {string} varName
   */
  constructor(varName) {
    this.varName = varName;
  }

  async diagnose() {
    const varValue = process.env[this.varName];
    if (typeof varValue === 'undefined') {
      return doctor.nok(`${this.varName} environment variable is NOT set!`);
    }

    if (await fs.exists(varValue)) {
      return doctor.ok(`${this.varName} is set to: ${varValue}`);
    }

    return doctor.nok(`${this.varName} is set to '${varValue}' but this is NOT a valid path!`);
  }

  async fix() {
    return (
      `Make sure the environment variable ${this.varName} is properly configured for the Appium server process`
    );
  }

  hasAutofix() {
    return false;
  }

  isOptional() {
    return false;
  }
}

const androidHomeCheck = new EnvVarAndPathCheck('ANDROID_HOME');

module.exports = {androidHomeCheck};

/**
 * @typedef {import('@appium/types').DoctorCheckResult} CheckResult
 */

このファイルはdoctor/android-home-check.jsとして保存し、package.jsonマニフェストに次のように追加できます。

  // ...
  "appium": {
    // ...
    "doctor": {
      "checks": [
        "./doctor/android-home-check.js",
      ]
    }
    // ...
  },
  // ...