跳至內容

建築醫生檢查

Appium Doctor 的構想是協助使用者設定驅動程式或外掛程式的先決條件。有時,這些先決條件可能相當複雜,需要具備非技術性的專業知識。Doctor 檢查是由擴充功能作者撰寫的香草 Node.js 類別實例,它透過自動化診斷和針對找到的問題提供可能的修正來簡化設定流程。這些檢查也可能是互動式的,以確保更好的使用體驗。

本教學課程應由外掛程式或驅動程式作者使用,他們希望協助其使用者處理複雜的設定或組態步驟。

新增 Doctor 檢查

輸入需求

術語Doctor Check實際上描述一個實作IDoctorCheck 介面的單一 javascript 類別實例。介面定義下列方法和屬性

  • diagnose(): Promise<DoctorCheckResult>:包含診斷可能問題的程式碼
  • fix(): Promise<string|null>:如果 hasAutofix() 傳回 true,則修正實際問題,或傳回可能手動修正的字串說明。如果此方法擲出名為 FixSkippedError 的例外,且 hasAutofix() 傳回 true,則將忽略方法呼叫的結果。
  • hasAutofix(): boolean:呼叫 fix() 是否會解決找到的問題
  • isOptional(): boolean:找到的問題是否可以忽略,且並非阻礙
  • log: AppiumLogger:可用於記錄。如果此屬性未指派,則實例本身或 Appium 伺服器可能會指派此屬性。

diagnose() 方法傳回的 DoctorCheckResult 物件必須包含下列屬性

  • ok: boolean:診斷是否未找到問題
  • optional: boolean:診斷問題是否可以安全地忽略
  • message: string:描述診斷結果的文字訊息

清單需求

單一擴充功能可以對 Appium 匯出多個 Doctor 檢查。為了讓伺服器 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",
      ]
    }
    // ...
  },
  // ...