就是它了!我們為您準備了這份完整的指南,教您如何利用強大的 WebdriverIO 框架,透過 JavaScript 設定 Appium 行動自動化測試。這種方法能夠確保高效且可擴展的行動測試自動化解決方案。我們希望這份指南能夠幫助您建立一致且可靠的測試腳本,從而加速您的行動應用程式交付。

Appium 安裝的先決條件 

若要開始使用 JavaScript 進行 Appium 自動化編程,請確保已安裝以下必要的軟體。我們建議使用特定版本以確保相容性並充分利用最新功能:

  • Node.js(建議使用 18.x 或更高版本): 這個 JavaScript 執行階段環境對於在瀏覽器之外執行 JavaScript 以及管理專案相依性至關重要。
  • 下載並安裝: 瀏覽 Node.js 官方網站 下載LTS版本,然後依照安裝程式的指示操作。
  • 驗證: 打開終端機或命令提示字元並運行:  
巴什
節點-v
npm -v

此處顯示已安裝的Node.js和npm版本。 

  • AndroidStudio: 為了在 Android 裝置或模擬器上進行測試,它提供了 Android SDK,其中包括: 亞行 用於設備識別的實用程式。
  • 下載並安裝: 從官方開發者網站下載 Android Studio跟著嚮導走。
  • 配置 Android SDK: 在 Android Studio 中,確保透過 SDK 管理器安裝了必要的 Android SDK 平台和建置工具。為模擬器設定 Android 虛擬裝置 (AVD)。
  • 環境變量: 確認你的 ANDROID_HOME 環境變數已設定為您的 Android SDK 目錄,並且 平台工具 (含 亞行)已新增至您的系統中 路徑.
  • 視覺工作室代碼: 一款免費、輕量且功能強大的 JavaScript 開發程式碼編輯器。
  • 下載並安裝: 訪問官方 Visual Studio Code 網站 並按照安裝說明進行操作。

安裝 Appium 

滿足所有前提條件後,我們可以使用 Appium 的命令列介面 (CLI) 來安裝它。 Appium CLI 在現代環境中應用廣泛,與 Appium Desktop 相比,它在自動化工作流程方面提供了更大的靈活性。 

1.全域安裝Appium CLI: 透過終端全域安裝 Appium 伺服器: 

巴什 
npm install -g appium@next 

@下一個 安裝 Appium 2.x,即當前主要版本,該版本具有改進的架構和驅動程式/插件管理。 

2. 安裝 Appium 驅動程式: Appium 2.x 使用「驅動程式即插件」模型,需要安裝特定的平台驅動程式: 

  • 對於Android:  
巴什 
appium驅動程式安裝uiautomator2 
  • iOS 系統(如適用):  
巴什
appium驅動安裝xcuitest 
  • 驗證: 使用以下命令檢查已安裝的驅動程式:  
巴什
Appium 驅動程式列表 

3. 啟動 Appium 伺服器: 一個有效的 執行測試需要 Appium 伺服器。只需運行以下命令即可啟動它: 

巴什
蘋果屬 

這將啟動預設連接埠上的 Appium 伺服器 4723. 

安裝必要的 JavaScript 程式庫 

我們使用 WebdriverIO 作為主要的測試自動化框架,取代了 selenium-webdriverWebdriverIO 是一個完整的解決方案,它具有強大的 CLI 用於設定、內建測試運行器,並支援各種斷言庫和報告器。 

1. 建立專案目錄: 在終端中導航到所需位置並建立新目錄: 

巴什
mkdir my-appium-project
cd my-appium-project

2. 初始化 WebdriverIO 專案: 使用 WebdriverIO CLI 設定您的專案。此命令將引導您完成設定問題: 

巴什
npx wdio 配置 

配置期間,請選擇:框架:「在我的本機上」、「Mocha」或「Jest」;編譯器「否」;預設測試檔案位置(./test/specs/**/*.js);「dot」和「spec」報告器;以及「appium」服務。 

這將產生您的 wdio.conf.js 檔案並安裝必要的依賴項,例如 WebdriverIO 和 @wdio/appium-service。 

3. 檢查 package.json 檔案: 跑完之後 npx wdio 配置,你的 的package.json 檔案更新及其所需依賴項(版本可能有所不同): 

JSON 

{ 
  “姓名”:“我的 Appium 專案”,
  “版本”:"1.0.0",
  “描述”“我的第一個使用 WebdriverIO 的 Appium 專案”,
  “主要的”: "index.js",
  “腳本”:{
    “wdio”: "wdio 運行 ./wdio.conf.js"
  },
  “關鍵字”:[],
  “作者”:",
  “執照”:"ISC",
  “開發依賴項”:{
    "@wdio/appium-service":"^8.xx",
    "@wdio/cli":"^8.xx",
    "@wdio/mocha-framework":"^8.xx",
    "@wdio/spec-reporter":"^8.xx",
    "webdriverio":"^8.xx"
  } 
} 

該票據 selenium-webdriver 不再是直接依賴項;WebdriverIO 處理與 Appium 的底層通訊。

了解 Appium 架構 

Appium 強大的客戶端伺服器架構支援跨平台行動測試自動化。了解其元件之間的互動方式是高效設計和排查自動化問題的關鍵。

Appium 伺服器 

Appium 是一個基於 Node.js 建構的 HTTP 伺服器。 Appium 2 的核心模組經過精簡,包含平台無關的功能,而特定的自動化功能則位於獨立的驅動模組中。這種設計可確保您無需修改應用程式或添加特殊代理,從而使測試環境與生產環境保持高度一致。

Appium客戶端 

Appium 用戶端程式庫簡化了在傳送 HTTP 要求時遵循 W3C WebDriver 協定的過程,讓您可以使用自己喜歡的語言編寫自動化腳本。對於 JavaScript,WebdriverIO 提供了一個豐富的 API 和一個用於行動自動化的框架。此外,還有更多適用於 Java、Python、Ruby 和 C# 的用戶端程式庫,它們都遵循 W3C WebDriver 伺服器通訊規格。

支持平台 

Appium 的跨平台功能提供了一個統一的 API,用於自動化跨作業系統的各種應用程式類型。 

Appium 主要支援: 

行動作業系統:  

  • Android的:
    • 原生應用: 使用 Android SDK(Java/Kotlin)建置。 Appium 使用 UI Automator 2(uiautomator2 司機)或濃縮咖啡(濃咖啡 司機)。
    • 行動網路應用: 透過 Chrome 等行動瀏覽器造訪的網站。
    • 混合應用程式: 結合原生使用者介面和嵌入式網頁視圖的應用。 
  • iOS版:
    • 原生應用: Appium 使用 iOS SDK(Swift/Objective-C)構建,並使用 Apple 的 XCUITest 框架(最可愛的 來自 Xcode 的驅動程式)。
    • 行動網路應用: 透過 iOS 系統上的 Safari 瀏覽器造訪的網站。
    • 混合應用程式: 與 Android 類似,結合了原生元件和 Web 元件。

使用 JavaScript 寫出你的第一個 Appium 測試 

讓我們開始使用 WebdriverIO 和 Mocha 框架來建立、執行和分析我們的第一個 Appium 測試腳本。

建立測試腳本 

WebdriverIO初始化之後, wdio.conf.js 管理全域配置,而測試文件位於 測試/規格 (或類似內容)。我們將創建 test/specs/login.spec.js 以一個假想的登入應用程式為例。 

1. 打開 wdio.conf.js: 

首先,配置 wdio.conf.js 功能,以便告知 Appium 要測試的設備和應用程式資訊。 

JavaScript的 

// wdio.conf.js
export const 配置 = {
    // ...其他配置...
    能力: [{
        平台名稱: '安卓',
        'appium:deviceName': 'emulator-5554', // 替換為您的裝置名稱或模擬器 ID
        'appium:平台版本': '11', // 替換為您的 Android 版本
        'appium:app': '/path/to/your/eribank.apk', // 重要:請提供 .apk 檔案的絕對路徑
        'appium:appPackage': 'com.experitest.ExperiBank', // 替換為你的應用程式包名
        'appium:appActivity': '.LoginActivity', // 替換為你的應用程式主活動
        'appium:automationName': 'UiAutomator2',
        // 'appium:noReset': true, // 可選:設定為 true 可防止應用在會話之間重置
        // 'appium:newCommandTimeout': 60000 // 可選:Appium 指令的逾時時間
    }],
    // ...其餘配置...
};

功能說明: 

  • 平台名稱: 行動裝置的作業系統(例如, “Android”、“iOS”).
  • appium:設備名稱: 裝置識別碼(例如, 模擬器-5554,Pixel_3a_API_30 適用於模擬器; ADB設備 (適用於真實設備)。
  • appium:平台版本: 您的裝置/模擬器的 Android 或 iOS 版本。
  • appium:app: 應用程式的絕對路徑 APK。 (Android)或 。暴力 (iOS)文件,Appium 安裝和啟動應用程式需要該文件。
  • appium:appPackage (Android)/ appium:bundleId (iOS):應用程式的唯一識別碼。
  • appium:appActivity (Android):要啟動的 Android 應用程式的主要活動。
  • appium:automationName: Appium自動化後端(UiAutomator2 對於安卓系統, XCUI測試 (適用於 iOS)。 

請注意: 對於 iOS,請進行配置 平台名稱:'iOS',appium:裝置名稱,appium:平台版本,appium:bundleId,appium:automationName:'XCUITest', 並點 appium:app 給你 。暴力 文件。 

2. 建立 login.spec.js: 

接下來,建立 test/specs/login.spec.js 文件,並新增以下內容。

JavaScript的 

// test/specs/login.spec.js
進口 { 預期 }   '@wdio/globals'; // WebdriverIO 內建的斷言庫

描述(“EriBank登入測試”,() => {
    // 此「before」鉤子會在本 describe 程式碼區塊中的所有測試之前執行一次
    前(異步 () => {
        // 檢查並處理任何出現的初始彈出窗口,例如“確定”按鈕
        這是應用程式首次發佈時的常見模式
        常量 okButtonSelector = '//*[@text="OK"]';
        常量 okElements = 等待 $$(okButtonSelector); // 用於尋找多個元素
        if (okElements.length > 0){
            安慰.紀錄(“找到確定按鈕,點擊它…”);
            等待 okElements[0]。點擊(); // 點選找到的第一個「確定」按鈕
            等待 驅動程式暫停(1000); // 稍作停頓,讓使用者介面穩定下來
        }
    });

    它(“應該能夠使用有效憑證成功登入”, 異步 () => {
        // 使用文字屬性(XPath)定位使用者名稱輸入字段
        常量 用戶名字段 = 等待 $('//*[@text="用戶名"]');
        等待 usernameField.setValue('公司'); // 輸入使用者名稱

        // 找到密碼輸入字段
        常量 密碼欄位 = 等待 $('//*[@text="密碼"]');
        等待 passwordField.setValue('公司'); // 輸入密碼 

        找到並點擊「登入」按鈕
        常量 登入按鈕 = 等待 $('//*[@text="登入"]');
        等待 登入按鈕.點擊();

        // 斷言:驗證登入是否成功。
        // 此範例假設成功登入後會顯示「餘額」文字。
        常量 balanceText = 等待 $('//*[@text="餘額"]');
        等待 expect(balanceText).toBeExisting(); // 檢查「餘額」元素是否存在 

        安慰.紀錄(登入成功,已找到“餘額”文字!);
    }); 

    // 在這裡新增更多測試案例(例如,無效登入、登出)
    // afterEach(async () => {
    // // 可選:每次測試後的清理操作,例如返回上一級或清除數據
    // await driver.reset(); // 重置應用程式狀態
    // }); 

    後(異步 () => {
        // 可選:完成此測試套件中的所有測試後要執行的操作
        // 例如,如果您開啟了瀏覽器,您可能會在這裡將其關閉。
        // 使用 WebdriverIO 時,驅動程式會根據 wdio.conf.js 設定管理會話生命週期。
        // 如果服務中配置了 `cleanup`,則此處不需要 `driver.quit()`。
    });
}); 

運行測試 

測試腳本準備好後,請確保 Appium 伺服器正在運行,並且裝置/模擬器已連接,然後再執行。

1. 啟動 Appium 伺服器: 

如果 Appium 伺服器尚未運行,請在終端機中啟動它: 

巴什
蘋果屬 

伺服器監聽 http://localhost:4723. 

2. 確保設備/模擬器正在運作: 

  • 仿真器: 透過 Android Studio 的 AVD 管理器啟動 Android 模擬器。
  • 真實設備: 透過 USB 連接您的 Android 設備,啟用 USB 偵錯,並驗證設備是否被識別。 ADB設備.

3. 執行 WebdriverIO 測試: 

在一個新的終端機(與 Appium 伺服器分開)中,從專案根目錄執行以下命令: 

巴什
npm run wdio 

此命令使用 wdio 腳本 in 的package.jsonWebdriverIO 讀取 wdio.conf.js它會連接到 Appium,在指定裝置上啟動您的應用,並執行測試。終端輸出將顯示測試進度,應用程式應該能夠啟動、執行操作並報告測試成功。

分析測試結果 

WebdriverIO 提供內建報表功能,以便即時獲得測試回饋。 規格 報告器提供簡潔的控制台摘要。 

  • 控制台輸出(規格報告器): 

在執行過程中,規範報告器會提供即時終端回饋,包括: 

  • 綠色對勾()通過測試。
  • 紅色 X 標記表示測試失敗,並附有錯誤訊息和堆疊追蹤。
  • 最終匯總結果,顯示通過/不通過的人數。
  • HTML 報告(建議用於詳細分析): 

若要產生詳細、可分享且對 CI/CD 友善的報告,請新增 HTML 報告器,例如 wdio-json-html-reporter 或 @wdio/allure-reporter。 

加上 wdio-json-html-reporter: 

安裝報告器: 

巴什
npm install --save-dev wdio-json-html-reporter 

更新 wdio.conf.js: 

將報告器新增至報告器陣列中,並包含一個 onComplete 鉤子以產生 HTML 報告。 

JavaScript的 

// wdio.conf.js
進口 { JSONReporter,HTMLReportGenerator }   'wdio-json-html-reporter'; // 新增此導入 

export const 配置 = {
    // ...其他配置...
    記者[
        'spec', // 保留控制台報告器以便立即回饋
        [JSONReporter, { // 新增 JSON 報告器以收集數據
            輸出檔案: './reports/test-results.json',
            截圖選項: 'onFailure' // 測試失敗時截取螢幕截圖
        }]
    ],
    // ...

    // 所有測試完成後要執行的函數。
    // 在這裡,您可以根據收集到的 JSON 資料產生 HTML 報表。
    完成時: 非同步函數(){
        常量 輸出檔案路徑 = './reports/test-report.html'; // HTML 報告的路徑
        常量 jsonFolder = './reports'; // JSON 報表的保存目錄

        常量 報表產生器 =  HTMLReportGenerator(outputFilePath);
        等待 reportGenerator.convertJSONFolderToHTML(jsonFolder);
        安慰.紀錄(`\nHTML 報告產生於:${outputFilePath}`);
    },
    // ...其餘配置...
};

重新運行測試:

再次執行 `npm run wdio` 後,會建立一個名為 reports 的資料夾。打開 測試報告.html 在瀏覽器中查看包含測試詳情、執行時間和失敗截圖的全面互動報告。

進階 Appium JavaScript 功能 

Appium 和 WebdriverIO 為處理複雜的行動場景提供了強大的功能。 

利用所需功能 

功能(在 Appium 2.x 和 W3C WebDriver 協定中稱為「期望功能」)是定義 Appium 自動化會話的測試環境和期望行為的鍵值對。它們對於指示 Appium 伺服器進行會話設定至關重要,這些設定包括裝置、應用程式和自動化設定。  

本節探討進階選項。

了解供應商前綴(appium:) 

Appium 2.x 和 W3C WebDriver 協定要求為非標準功能新增廠商前綴。 Appium 的字首是 appium:避免與 W3C 標準或其他供應商功能發生衝突。 

Android 的常用與進階功能 (uiautomator2 司機): 

JavaScript的 

// wdio.conf.js 中的範例 Android 功能 

能力: [{
    平台名稱: '安卓',
    'appium:deviceName': 'Pixel_3a_API_30', // 或透過 `adb devices` 取得您的實際裝置 ID
    'appium:platformVersion': “11”,
    'appium:app': '/path/to/your/app.apk',
    'appium:appPackage': 'com.yourcompany.yourapp',
    'appium:appActivity': '.MainActivity',
    'appium:automationName': 'UiAutomator2',
    'appium:noReset': , // 在測試之間保持應用程式狀態
    'appium:fullReset': , //避免每次會話都重新安裝應用程式
    'appium:newCommandTimeout': 120000, // 增加慢速指令的超時時間
    'appium:enableMultiWindows': , // 適用於使用多個視窗/活動的應用程式
    'appium:systemPort': 8201, // 指定用於平行執行的系統連接埠
    'appium:autoGrantPermissions': , // 自動接受應用程式權限
    'appium:chromeOptions':{ 參數['--disable-webview-gpu'] }, // 用於混合應用 WebView 偵錯
    'appium:avd': 'Pixel_3a_API_30', // 如果尚未執行,則按名稱啟動指定的 AVD
    'appium:avdLaunchTimeout': 300000, // AVD啟動逾時
    // 'appium:chromedriver可執行檔': '/path/to/custom/chromedriver', // 用於特定的 Chrome/WebView 版本
}],

iOS 的通用和進階功能(XCUITest 驅動程式):

JavaScript的 

// wdio.conf.js 中的 iOS 功能範例 

能力: [{
    平台名稱: iOS,
    'appium:deviceName': “iPhone 15 Pro”, // 或您特定的模擬器/裝置名稱
    'appium:platformVersion': “17.0”,
    'appium:app': '/path/to/your/app.app', // .app 檔案(用於模擬器)或 .ipa 檔案(用於真機)的路徑
    'appium:bundleId': 'com.yourcompany.yourapp',
    'appium:automationName': 'XCUITest',
    'appium:udid': '您的設備 UDID', // 真實裝置必需
    'appium:noReset': ,
    'appium:fullReset': ,
    'appium:newCommandTimeout': 120000,
    'appium:xcodeOrgId': '您的團隊 ID', // 真實裝置必需
    'appium:xcodeSigningId': “蘋果開發者”, // 真實裝置必需
    'appium:updatedWDABundleId': 'com.yourcompany.WebDriverAgentRunner', // WDA 的自訂捆綁包 ID
    'appium:autoAcceptAlerts': , // 自動接收系統警報(例如,位置資訊、推播通知)
    'appium:usePrebuiltWDA': , // 使用預先建置的 WebDriverAgent 以加快啟動速度
    'appium:webkitDebugProxyPort': 27753, // 用於混合應用 WebView 偵錯
}], 

能力方面的關鍵要點: 

  • 文檔是關鍵: 請務必參考 Appium 官方文件以取得最新功能。
  • 平台特異性: 許多功能是 Android 或 iOS 及其各自驅動程式所獨有的(UiAutomator2, XCUI測試).
  • 效能與穩定性: 功能如下 noReset, 完全重置新的指令超時 對測試執行速度和穩定性有顯著影響。
  • 調試: chromeOptions or webkitDebugProxyPort 對於調試混合應用程式的 Web 視圖至關重要。
  • 並行執行: 對於並行測試, 系統連接埠 (Android)或確保唯一性 udids (iOS)至關重要。

處理行動手勢 

行動應用程式大量使用滑動、捲動、長按和捏合縮放等手勢。 WebdriverIO 與 Appium 結合,為這些互動提供了強大的 API,並優先採用 W3C Actions API(行動 命令)因其靈活性和標準遵循性而備受青睞。 Appium 也公開了專門的命令。 移動: 常用手勢的指令。 

1. 點選和長按: 基本互動通常直接在元素上進行。 

JavaScript的 
// test/specs/gestures.spec.js

描述(“移動手勢”,() => {
    它(“應該對某個元素執行長按操作”, 異步 () => {
        // 假設你有一個回應長按的元素
        常量 longPressElement = 等待 $('~長按我'); // 使用輔助使用 ID 的範例

        // 使用 WebdriverIO 的便捷方法進行長按
        等待 longPressElement.longPress();
        安慰.紀錄(“對元件執行了長按操作。”);

        // 驗證某些結果,例如,是否出現了上下文選單
        常量 上下文選單 = 等待 $('//*[@text="上下文選單項目"]');
        等待 期望(contextMenu).toBeExisting();
    });

    它(“應該點擊座標”, 異步 () => {
        // 有時你需要點擊螢幕上的特定座標,
        // 例如,點選輸入欄位外部即可關閉鍵盤。
        // 如果需要,取得螢幕尺寸:await driver.getWindowRect();
        常量 螢幕寬度 = (等待 driver.getWindowRect()).width;
        常量 螢幕高度 = (等待 driver.getWindowRect()).height;

        // 點擊螢幕中心附近
        等待 driver.touchPerform([
            { 行動: '輕敲', 方案:{ x螢幕寬度 / 2, y螢幕高度 / 2 } }
        ]);
        安慰.紀錄(“點擊螢幕座標。”);
    });
});

2. 滑動和滾動: 滑動操作會拖曳手指,而捲動操作則會在視圖內移動內容。 

運用 瀏覽器滑動() (WebdriverIO 便捷方法): 

JavaScript的 

它(應該執行滑動操作, 異步 () => {
    // 在可捲動元素內向下捲動
    // 這適用於簡單的單向滾動
    常量 可捲動元素 = 等待 $('android.widget.ScrollView'); // 或 iOS 等效版本

    等待 scrollableElement.swipe({ 方向: '向上', 百分: 0.8, 為期: 1000 }); // 在 1 秒內向滑動元素高度的 80%。
    安慰.紀錄(在可捲動區域內向上滑動。);

    或者,全螢幕滑動。
    // await browser.swipe({ direction: '左邊',持續時間:500});
}); 


使用 Appium 的 mobile: scroll 或 mobile: swipe 執行指令:
對於複雜的捲動/滑動場景,尤其是有特定元素或方向的場景,這些功能通常更加強大。

JavaScript的 

它('應該滾動到使用 mobile:scroll 的元素', 異步 () => {
    // 假設您希望向下捲動直到「目標元素」可見
    常量 targetElementSelector = '//*[@text="目標元素"]';

    等待 driver.execute('mobile: scrollGesture',{
        elementId:(等待 $('android.widget.ScrollView').elementId, // 要捲動的元素
        方向: '向下',
        百分: 1.0, // 捲動查看完整視圖
        速度: 5000 // 速度單位為像素每秒
    });

    常量 目標元素 = 等待 $(targetElementSelector);
    等待 期望(目標元素).存在;
    安慰.紀錄(已捲動至目標元素。);
});

它(“應該在輪播圖中水平滑動”, 異步 () => {
    // 用於特定的、可控的滑動操作(例如,輪播圖)
    常量 輪播元素 = 等待 $('~圖片輪播'); // 範例輔助使用 ID

    等待 driver.execute('移動端:滑動手勢',{
        elementId: carouselElement.elementId,
        方向: '左邊', // 從右向左滑動
        百分: 0.75, // 在元素上滑動 75%
        速度: 5000
    });
    安慰.紀錄(“向左滑動輪播圖。”);
});

3. 捏合縮放(多點觸控手勢): 捏合縮放功能需要兩根手指向內或向外移動,通常使用 W3C Actions API 的指標類型。 

JavaScript的 

它(“應該執行捏合縮放手勢”, 異步 () => {
    常量 目標圖像 = 等待 $('~可縮放影像'); // 用於捏合/縮放的元素 

    // 取得元素的中心座標
    常量 元素位置 = 等待 targetImage.getLocation();
    常量 元素大小 = 等待 targetImage.getSize();
    常量 centerX = elementLocation.x + elementSize.width / 2;
    常量 centerY = elementLocation.y + elementSize.height / 2;

    // 使用 W3C Actions API 定義捏合手勢
    等待 driver.performActions([
        {
            類型: '指針',
            id: 'finger1',
            參數:{ 指標型: '觸碰' },
            行動[
                { 類型: '向下指針', x:centerX - 50, y: centerY }, // 食指 1 從中心左側開始。
                { 類型: '暫停', 為期: 100 },
                { 類型: 'pointerMove', 為期: 500, x:centerX - 10, y: centerY } // 手指 1 向右稍稍移動
            ]
        },
        {
            類型: '指針',
            id: 'finger2',
            參數:{ 指標型: '觸碰' },
            行動[
                { 類型: '向下指針', x:centerX + 50, y: centerY }, // 第二根手指從中心右側開始。
                { 類型: '暫停', 為期: 100 },
                { 類型: 'pointerMove', 為期: 500, x:centerX + 10, y: centerY } // 第二根手指稍微往左移動
            ]
        }
    ]);
    等待 驅動程式暫停(1000); // 預留動畫時間
    等待 driver.releaseActions(); // Release 指針

    安慰.紀錄(“執行了捏合縮放手勢。”);
    // 確認圖像已按預期放大/縮小(例如,檢查其大小)
});

關於手勢的重要說明: 

  • W3C Actions API(driver.performActions): 使用順序指針操作來定義複雜的多點觸控和單點觸控手勢的最靈活、標準化的方法。
  • 移動: 命令: Appium 提供特定功能 移動: 命令(例如, 行動端:滾動手勢, 行動端:滑動手勢這些是底層驅動程式原生支援的,對於常見手勢來說更簡單,透過以下方式執行: driver.execute('mobile:commandName', { /* 參數 */ }).
  • 平台差異: 底層原生自動化框架(UI Automator 2、XCUITest)的行為有所不同。請在 Android 和 iOS 上全面測試手勢。
  • 座標系: 注意座標是絕對螢幕座標還是相對於元素的座標。

使用真機與模擬器 

在真實設備和模擬器/模擬器之間進行選擇至關重要,這會影響測試的準確性、速度、成本和覆蓋範圍。

模擬器(Android)/模擬器(iOS) 真實設備
優點
  • 經濟實惠:免費,無需任何硬體設備。
  • 可擴充性:輕鬆啟動多個執行個體。
  • 受控環境:設定簡單,重置方便,可模擬網路/電池。
  • 快速回饋:加快 UI 測試的啟動和執行速度。
  • 調試:與開發環境完美整合。
  • 廣泛的配置:模擬各種螢幕尺寸、解析度、作業系統版本。
  • 準確度:提供最準確的應用程式效能、使用者介面和使用者體驗結果。
  • 硬體功能測試:對於依賴實際硬體的功能而言至關重要。
  • 真實場景:在真實的網路條件下進行測試,並應對網路中斷​​。
  • 真正的使用者體驗:對觸控回應和動畫的真實回饋。
  • 廠商特定問題:發現特定於設備型號或作業系統定制的錯誤。
缺點
  • 硬體模擬功能有限:無法複製相機、GPS、生物辨識等功能。
  • 效能差異:可能無法反映實際效能,尤其是對於資源密集型應用程式。
  • 實際環境:難以模擬通話、簡訊或變化的手機訊號。
  • 觸控響應:可能無法完美模擬真實設備的行為。
  • 作業系統特性:可能無法複製製造商的客製化設定或作業系統的一些細微行為。
  • 成本:購置和維護各種設備成本高。
  • 設定和維護:設定、管理、收費和更新都比較複雜。
  • 可擴展性挑戰:並行測試難以擴展/成本高。
  • 可用性:設備可能正被他人使用,導致延遲。
  • 調試複雜性:更具挑戰性,通常需要直接連接或雲端工具。
  • 不穩定性:現實世界中的變數可能會導致測試不穩定。

許多組織採用混合策略:使用模擬器進行日常快速測試,並預留少量真實設備(內部或雲端)用於接近發佈時的關鍵性、端到端和對效能要求極高的測試。這種策略兼顧了速度、成本和準確性。 

Appium 測試的偵錯與故障排除 

本節涵蓋常見的 Appium 測試問題、使用 Appium Inspector 進行元素識別,以及記錄和報告以隔離問題的最佳實踐。 

常見問題和解決方案 

以下是一些常見的 Appium 問題及其典型解決方案: 

1. Appium 伺服器未運作或配置錯誤:

  • 問題: 經濟拒絕 或出現「無法連線到 Appium 伺服器」錯誤。
  • 解決方案: 請確保 蘋果屬 正在單獨的終端機中運作。請驗證 wdio.conf.js 指向正確的 Appium 伺服器位址和連接埠(預設值: http://localhost:4723Appium 2.x 的預設基本路徑是 / (不是 /wd/hub).

2. 設備/模擬器未連接或未被識別:

  • 問題: 「未找到裝置」、「找不到已連線的安卓裝置」或「沒有可用裝置」錯誤。
  • 解決方案(Android): 驗證設備連接和調試(ADB設備)。 確保 ANDROID_HOME 平台工具 位於環境變數中 路徑對於模擬器,請確保在測試前已啟動運行。
  • 解決方案(iOS): 確保模擬器已啟動。對於真機,請驗證連線、信任關係和開發者模式(iOS 16+)。檢查 WebDriverAgent 的 Xcode 簽章。

3. 找不到元素 (NoSuchElementError):

  • 問題: 由於定位器錯誤、時機不當或元件缺失,測試未能定位到元件。
  • 解決方案:
    • 驗證定位器: 使用 Appium Inspector 可以準確地識別穩定的定位器(例如,輔助功能 ID、唯一 ID),而不是不穩定的 XPath。
    • 等待策略: 使用以下方式實現顯式等待 browser.waitUntil(), element.waitForExist(), 或者 element.waitForDisplayed() 確保元素存在和互動性。
JavaScript的 

等待 browser.waitUntil(異步 () => {
    返回 (等待 $('//*[@text="登入按鈕"]').isDisplayed());
}, { 超時: 10000, 逾時訊息: 預計10秒後顯示登入按鈕 });
等待 $('//*[@text="登入按鈕"]')。點擊();
    • 應用程式狀態: 確保應用程式處於元素出現的預期狀態(例如,導航完成,沒有遮蔽的彈出視窗)。 

4. 會話未建立 (SessionNotCreatedException): 

  • 問題: Appium 無法啟動新的自動化會話,通常是由於功能無效或衝突造成的。
  • 解決方案: 
    • 審查能力: 仔細檢查 wdio.conf.js 功能:錯誤的絕對應用程式路徑;不匹配 設備名稱 or 平台版本不正確 應用程式包/捆綁包 ID or appActivity缺失/錯誤 自動化名稱.
    • 檢查 Appium 伺服器日誌: Appium 伺服器控制台會提供會話建立失敗的詳細原因。
    • 應用權限: 使用 appium:autoGrantPermissions: true (Android)或 appium:autoAcceptAlerts: true (iOS)用於啟動時需要權限的應用程式。 

5. 不穩定的測試(間歇性故障): 

  • 問題: 測試結果時而通過時而失敗,且程式碼未做任何變更。
  • 解決方案:
    • 穩健等待: 替換靜態 驅動程式暫停() 使用顯式、條件等待。
    • 同步: 在進行互動之前,請確保使用者介面穩定(例如,等待載入指示器消失)。
    • 網絡延遲: 對於依賴網路的應用程序,應考慮設定更長的超時時間。
    • 測試隔離: 確保測試相互獨立。 noReset: false, 完全重置:真, 或者 driver.reset()/driver.terminateApp()/driver.launchApp() 測試之間。
    • 穩定定位器: 重新評估動態變化的定位器。 

6. iOS 真機上的 WebDriverAgent (WDA) 問題: 

  • 問題: WDA 無法在裝置上建置、安裝或啟動。
  • 解決方案: 
    • Xcode簽名: 確保正確 xcodeOrgId xcode簽署ID Xcode 的功能和正確的 Apple Developer 帳戶配置。 
    • 手動建置 WDA: 在 Xcode 中手動建立 WebDriverAgentRunner 應用程式 (〜/ .appium/node_modules/appium-xcuitest-driver/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj). 
    • 信任開發者: 在 iOS 裝置上,前往 設定 > 常規 > VPN 和裝置管理 信任你的開發者應用程式。 

使用 Appium Inspector 

Appium Inspector 提供了一個圖形介面,用於在裝置/模擬器上檢查應用程式 UI,幫助識別元素、探索屬性並產生準確的定位器,這對於強大的測試至關重要。 

如何在 Appium 2.x 使用 Appium Inspector: 

1. 下載 Appium Inspector: 從 Appium Inspector GitHub 發布頁面取得獨立應用程式。 

2. 啟動 Appium 伺服器: 請確保您的 Appium 伺服器在終端機中運作:  

巴什
蘋果屬 

3. 啟動 Appium Inspector: 開啟下載的應用程式。 

4. 設定連接和功能:  

  • 遠端主機: 127.0.0.1 (本地主機)。
  • 遠端埠: 4723 (默認)。
  • 路徑: 留空或設定為 / (Appium 2.x 預設)
  • 新增所需功能: 從你的系統中貼上相同的功能 wdio.conf.js (確保應用路徑為絕對路徑)。 範例(Android):  
JSON 

{
  平台名稱: “安卓”,
  "appium:deviceName": “模擬器-5554”,
  "appium:platformVersion": “11”,
  "appium:app": "/path/to/your/eribank.apk",
  "appium:appPackage": "com.experitest.ExperiBank",
  "appium:appActivity": ".LoginActivity",
  "appium:automationName": “UiAutomator2”
} 
  • 儲存功能(選購): 儲存功能集以便將來快速載入。 

5. 開始會話: 點選“開始會話”。 Appium Inspector 將連接到您的 Appium 伺服器,並在裝置/模擬器上啟動您的應用程式。 

6. 檢查元素:  

  • 左側會顯示您的應用程式截圖。
  • 將滑鼠懸停在元素上,即可在右側窗格中顯示詳細資訊(定位器、文字、大小、位置)。
  • 點選可反白元素詳情。
  • 使用“搜尋”框按定位器尋找元素。
  • 操作: 直接從使用者介面執行基本操作(點擊、發送按鍵、清除、滑動、捲動、點擊)進行驗證。 

7. 識別定位器: 檢查員的主要用途是獲取可靠的定位資訊。  

  • 優先排序: 輔助功能 ID > ID > 類別名稱 > XPath。 XPath 應作為最後的選擇,優先使用相對路徑和特定路徑。
  • 將選定的定位器直接複製到您的 WebdriverIO 測試腳本中。

記錄和報告 

全面的日誌記錄和有效的報告對於調試失敗的測試、監控測試套件的運作狀況以及溝通結果至關重要。 

1. Appium 伺服器日誌 

Appium 伺服器會產生詳細的日誌,這對於偵錯伺服器端、驅動程式或通訊問題非常有價值。 

  • 訪問日誌: 直接列印到終端上 蘋果屬 已啟動,推出。
  • 冗長: 使用控制日誌級別 日誌等級 (例如, appium –log-level debug).
  • 時間戳記: 新增 –log-timestamp 為了更方便地進行事件追蹤。
  • 日誌過濾(Appium 2.x): 支持 –log-filters 或用於編輯敏感資訊的配置。 

2. WebdriverIO 測試運行器日誌 

WebdriverIO 的測試運行器提供控制台輸出,特別是使用 spec 報告器時,會詳細說明測試執行情況。 

  • console.log()在測試腳本中使用,可以列印變數值、元素狀態或偵錯資訊;這些資訊會顯示在執行的終端中。 npm run wdio.
  • WebdriverIO 日誌等級: 配置 wdio.conf.js 通過 日誌等級 屬性(例如, '資訊', '偵錯')控制內部操作細節。 

3. 測試報告 

除了控制台日誌之外,結構化的測試報告對於理解結果和 CI/CD 整合至關重要。 

  • HTML 報告器(例如, wdio-json-html-reporter): 產生人類可讀的報告,包括測試步驟、通過/失敗狀態、持續時間和可選的失敗螢幕截圖。 
  • Allure 記者(@wdio/allure-reporter): 一款廣受歡迎且功能強大的報表工具,可產生互動式 HTML 報表,包括:
    • 測試步驟和狀態
    • 測試數據
    • 螢幕截圖(尤其是失敗時的螢幕截圖)
    • 附件(例如,頁面原始碼、網站日誌)
    • 歷史趨勢
    • 缺陷類別。
    • 設定(範例):
      • 安裝:  
巴什 
npm install --save-dev @wdio/allure-reporter allure-commandline 
      • 配置 wdio.conf.js:  
JavaScript的 

// wdio.conf.js
export const 配置 = {
    // ...
    記者[
        'spec', // 保留控制台輸出
        ['引誘',{
            輸出目錄: './allure-results', // Allure XML 資料目錄
            停用 WebdriverStepsReporting: , // 可選:避免重複步驟
            停用 WebDriver 螢幕截圖報告: , // 螢幕截圖
        }],
    ],
    // ...
    // 新增 `afterTest` 鉤子,以便在 Allure 測試失敗時擷取螢幕截圖。
    測試後: 非同步函數(測試,上下文,{錯誤,結果,持續時間,通過,重試次數}){
        if (!passed){
            等待 browser.takeScreenshot(); // WebdriverIO 會自動連線到 Allure
        }
    },
    // ...
}; 
      • 產生 HTML 報告(測試運行後):  
巴什 

npx allure generate allure-results --clean -o allure-report
npx allure 開啟 allure 報告 

這將會產生並在瀏覽器中開啟 HTML 報告。 

    • CI/CD 整合: 將測試報告整合到 CI/CD 管線(Jenkins、GitLab CI、GitHub Actions、Azure)中 DevOps) 使用外掛程式或內建功能解析 JUnit XML 或 Allure 報告,顯示趨勢,並在發生故障時發出通知。 

有系統地使用這些偵錯工具,了解常見的陷阱,並利用全面的日誌記錄和報告,可以顯著提高 Appium 自動化套件的穩定性和可維護性。

將 Appium JavaScript 與其他工具集成 

將 Appium JavaScript 測試與 CI 工具、進階報告和雲端測試平台集成,可增強執行力、回饋和可擴充性。 

持續整合工具 

持續整合 (CI) 涉及頻繁地將程式碼合併到中央程式碼庫,並執行自動化測試以儘早發現整合問題。將 Appium 測試整合到 CI 管線中,可確保行動應用程式的持續驗證和快速的回​​歸檢測。 

CI 伺服器的一般流程包括: 

  1. 拉取代碼: 從版本控制系統中取得測試自動化程式碼。
  2. 安裝依賴項: 安裝 Node.js、Appium 和專案 npm 依賴項。
  3. 啟動 Appium 伺服器: 本地啟動 Appium 或連接到遠端/雲端伺服器。
  4. 準備設備/模擬器: 配置 CI 代理程式以啟動 Android AVD、iOS 模擬器或從雲端平台配置真實裝置。
  5. 執行測試: 使用以下方式執行 WebdriverIO 測試 npm run wdio.
  6. 生成報告: 執行完畢後發布測試報告(例如 Allure、JUnit XML)。 

CI 工具整合範例: 

  • 詹金斯:
    • 插件: 使用外掛程式進行 Node.js、Allure 報告發布和 Android 模擬器管理(通常透過 shell 腳本)。
    • 管道腳本(聲明式):  
Groovy的 

管道 {
    任何代理人
    階段{
        階段('查看'){
            步驟 {
                混帳 'https://github.com/your-repo/your-appium-project.git'
            }
        }
        階段(“安裝依賴項”){
            步驟 {
                sh 'npm install'
            }
        }
        階段(啟動 Appium 和模擬器(Android 範例)){
            // 這通常在後台進程或專用代理程式上運行。
            // 為簡單起見,這裡展示一個基本的 shell 指令。
            // 在現實世界中,可能會使用單獨的專用代理或雲端提供者。
            步驟 {
                // 啟動 Android 模擬器(需要在代理程式上安裝 Android SDK)
                // 範例:在背景啟動 AVD
                sh 'emulator -avd -no-audio -no-window &> /dev/null &'
                sh 'adb wait-for-device'
                sh 'appium &' // 在背景啟動 Appium 伺服器
                sh '睡10' // 給 Appium 一些時間啟動
            }
        }
        階段(執行 Appium 測試){
            步驟 {
                sh 'npm run wdio'
            }
        }
        階段(“產生並發布報告”){
            步驟 {
                sh 'npx allure generate allure-results --clean -o allure-report'
                引誘([
                    包含屬性: ,
                    JDK: '',
                    性能: [],
                    報告建構令牌: [],
                    報告目錄: 'allure-report'
                ])
            }
        }
    }
    郵政 {
        總是 {
            // 清理(終止模擬器、Appium 伺服器)
            sh 'adb emu kill || true'
            sh 'killall node || true' // 注意:會終止所有節點進程
        }
    }
}
  • GitLab CI/CD:
    • 使用一個 .gitlab-ci.yml 文件並利用 Docker 映像(例如, 節點: -靶心 或使用 Appium/Android SDK 自訂映像)。
    • .gitlab-ci.yml 片段:  
雅美 

圖片: 節點:18-靶心 或使用 Android SDK 和 Appium 製作自訂鏡像

變量:
  ANDROID_SDK_ROOT: "/opt/android-sdk" # Docker 容器內的路徑 

腳本之前:
  - apt-get update && apt-get install -y --no-install-recommends openjdk-11-jre-headless unzip curl
  # 下載並安裝 Android SDK
  - if [ ! -d "$ANDROID_SDK_ROOT" ]; 然後 mkdir -p $ANDROID_SDK_ROOT && curl -o $ANDROID_SDK_ROOT/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-858302-latest.zip &dzipz&iipz&iD. $ANDROID_SDK_ROOT/cmdline-tools; fi
  - export PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/cmdline-tools/latest/lib:$ANDROID_SDK_ROOT/platform-tools 
  -  | sdkmanager --licenses
  - sdkmanager "platforms;android-30" "platform-tools" "build-tools;30.0.3" "emulator" "system-images;android-30;google_apis;x86"
  - 錯過 沒有 | avdmanager create avd -n test_avd -k "system-images;android-30;google_apis;x86"
  - npm install -g appium@next # 安裝 Appium CLI
  - appium驅動程式安裝uiautomator2 # 安裝 Android 驅動程式
  - npm安裝 # 安裝專案依賴項

測試:appium:
  階段: test
  腳本:
    - 模擬器 -avd test_avd -no-window -no-audio -gpu 關閉 &
    - adb wait-for-device
    - adb shell 輸入按鍵事件 82 # 解鎖螢幕
    - appium &
    - 睡覺 10 # 給 Appium 一些時間啟動
    - npm run wdio
  文物:
    路徑:
      - allure-results/ # 根據Allure報道
      - 截圖/    # 如果你儲存了螢幕截圖
    expire_in: 1 
  after_script:
    - npx allure generate allure-results --clean -o allure-report
    - 殺死 $(jobs -p) ||  # 結束後台進程 

與其他 CI 工具(GitHub Actions、Azure)集成 DevOpsCircleCI)遵循類似的模式,使用其特定的配置語法。

測試報告工具 

雖然 WebdriverIO 的報告器可以提供基本信息,但專業的工具可以提供更豐富、互動且可共享的儀表板。這些儀表板可以匯總資料、顯示歷史趨勢、對故障進行分類,並包含詳細的故障資訊。 

  • 《魅力報告》: (詳見「調試與故障排除」部分)
    • 為什麼: 具有高度互動的 HTML 報告,包含步驟、附件、趨勢和分類缺陷,非常適合協作和溝通。
    • 整合化: 用途 @wdio/allure-reporter allure 命令列 從 XML 資料產生報告。
  • 報告入口網站:
    • 為什麼: 利用人工智慧進行分析,實現快速故障分析、類似缺陷自動分析和即時儀表板顯示。
    • 整合化: 用途 @reportportal/agent-webdriverio 作為 WebdriverIO 報告器,配置了伺服器 URL 和 API 金鑰。
  • 自訂 HTML/儀錶板解決方案: 針對特殊需求,處理來自 WebdriverIO 的 JUnit XML 或 JSON 輸出,以產生自訂報表或將資料推送到內部儀表板。 

有效的測試報告對於以下方面至關重要: 

  • 更快的調試速度: 利用豐富的背景資訊快速精準地找出失敗原因。
  • 趨勢分析: 持續監測測試套件的穩定性和性能。
  • 利害關係人溝通: 提供清晰易懂的報告。
  • 質量門: 定義 CI/CD 流水線的指標。

雲端測試平台 

在雲端平台上執行行動自動化測試已成為標準做法,可實現廣泛的設備覆蓋、可擴展的並行執行,並降低內部設備實驗室的開銷。這些平台提供種類繁多的真實設備和模擬器/模擬器。 

他們是如何工作的: 您的 WebdriverIO 測試連接到由雲端平台託管的遠端 Appium 伺服器,該伺服器在 wdio.conf.js 中配置了提供者的 hub URL 和特定功能(包括 API 金鑰/使用者名稱),以選擇裝置並觸發雲端 Appium 會話。 

Digital.ai 測試,您的 Appium JavaScript 雲端測試平台: 

  • 功能: 強大的行動應用測試平台,包括真實設備雲端、模擬器和企業集成,重點是功能、性能和可訪問性。
  • 整合化: 使用您的唯一存取金鑰,透過特定 URL 連接到雲端網格,以定義裝置和環境。 

的好處 Digital.ai 測試: 

  • Deploy選項: 使用本地部署設備、專用私有雲設備或混合方案,實現無與倫比的安全性和可靠性。
  • 可擴展性: 在各種設備上並行運行測試,大幅縮短執行時間。
  • 設備覆蓋範圍: 無需擁有實體設備即可存取各種設備和作業系統版本。借助共享設備,可根據需要快速擴展。
  • 維護和更新: Digital.ai 測試工作包括設備維護、作業系統更新和 Appium 伺服器管理。
  • 全球訪問: 只要有網路連接,就可以隨時隨地進行測試。
  • 高級分析: 整合式儀錶板,用於顯示效能指標和雲端資源使用情況。

Appium JavaScript 最佳實踐 

開發有效的 Appium 自動化需要遵循最佳實踐,包括結構化、效能最佳化和 safe防止故障,以確保使用壽命長、易於維護和可靠。

建立測試套件 

組織良好的測試套件更易於理解、維護和擴展。關鍵模式和原則包括: 

1. 頁面物件模型(POM): 

  • 概念: 將使用者介面元素(定位器)和互動(方法)與測試邏輯分開。每個應用程式頁面/元件都有自己的 JavaScript 類別。
  • 為妳而設的優點:
    • 可維護性: 在一個地方更新定位器。
    • 可讀性: 高層次、清晰的測試步驟。
    • 可重用性: 頁面物件方法是可重複使用的。
  • 實現範例:  
JavaScript的 

// pages/LoginPage.js
 登錄頁面 {
    獲得 使用者名稱輸入(){
        返回 $('~使用者名稱輸入欄位'); // 輔助使用 ID 或其他穩定定位器
    }

    獲得 密碼輸入(){
        返回 $('~密碼輸入框');
    }

    獲得 登入按鈕(){
        返回 $(“~登入按鈕”);
    }

    異步 打開(){
        // 如有需要,導航至登入畫面,或處理初始應用程式狀態
        等待 browser.url('/'); // 範例適用於 Web 環境,請根據行動應用程式進行調整
    }

    異步 登錄(用戶名,密碼){
        等待 Free Introduction .usernameInput.setValue(username);
        等待 Free Introduction .passwordInput.setValue(password);
        等待 Free Introduction .loginButton.click();
    } 

    異步 isLoginButtonDisdisplayed(){
        返回 Free Introduction .loginButton.isDisplayed();
    }
}
匯出預設新 登入頁面(); // 匯出實例

// test/specs/login.e2e.js
進口 登錄頁面   '../pages/LoginPage';
進口 首頁   '../pages/HomePage'; // 假設你有一個 HomePage 對象

描述(登入功能,() => {
    beforeEach(異步 () => {
        等待 登入頁面.開啟(); // 確保每次測試前我們都在登入頁面
    });

    它(“應該允許使用者使用有效憑證登入”, 異步 () => {
        等待 登入頁面.登入('standard_user', 'secret_sauce');
        等待 expect(HomePage.productsHeader).toBeExisting(); // 驗證登入是否成功
    });

    它(“如果憑證無效,則應該顯示錯誤訊息”, 異步 () => {
        等待 登入頁面.登入('無效用戶', 'wrong_password');
        常量 錯誤訊息 = 等待 $('~錯誤訊息文字'); // 錯誤訊息範例
        等待 expect(errorMessage).toBeExisting();
        等待 expect(errorMessage).toHaveText(“無效憑證”);
    });
}); 

2. 模組化測試檔: 將測試分解成更小、更集中的檔案(例如, login.spec.js, product.spec.js為了方便管理。 

3. 輔助/實用函數: 建立單獨的檔案來存放不特定於某個頁面的常用、可重複使用的功能,例如資料產生(utils/dataGenerator.js),等待助手(utils/waitHelpers.js),或報告幫助者(utils/reportingHelpers.js). 

4. 配置管理: 將組態(功能、URL、憑證、逾時)外部化到一個中央檔案(例如, wdio.conf.js, .ENV 檔案或 JSON 配置)。對於敏感數據或動態數據,請使用環境變數。

優化性能 

測試速度慢會阻礙自動化帶來的優勢。優化 Appium 測試效能至關重要。 

  • 明智的等待策略:
    • 避免 driver.pause() / sleep(): 硬編碼的等待會導致測試速度慢、不穩定。
    • 使用顯式等待: WebdriverIO 提供 element.waitForExist(), element.waitForDisplayed(), element.waitForEnabled()browser.waitUntil() 實現可靠的、基於條件的等待。 
 

JavaScript的 

// 而不是: 等待 驅動程式暫停(5000);
等待 $(“~登入按鈕”).waitForDisplayed({ 超時: 10000, 逾時訊息: “10秒後登入按鈕仍未顯示” });
等待 $(“~登入按鈕”)。點擊(); 
  • 最優定位策略:
    • 優先考慮穩定的定位器: 優先使用輔助功能 ID,其次是 ID。類別名稱速度可能很快,但通常不唯一。 XPath 速度最慢且最不穩定;僅在萬不得已的情況下使用,最好使用相對 XPath。
  • 減少 Appium 指令:
    • 每條指令都會產生開銷。透過重複使用元素引用來最大限度地減少冗餘查詢。
    • 批量操作或設計頁面物件以減少重複查找。
  • 管理應用程式狀態(功能):
    • noReset 完全重置: noReset: true 防止會話之間應用程式狀態重置,無需重新開始即可加快測試速度。 完全重置:真 重新安裝/清除資料以實現全新啟動,但速度較慢。
    • 戰略性使用 driver.launchApp(), driver.closeApp(), driver.reset(): 在測試中控制應用程式生命週期以提高效率。
  • 並行執行: 透過 WebdriverIO 的 能力 陣列和 –maxInstances大幅縮短總執行時間。
  • 避免不必要的螢幕截圖/日誌記錄: 過多的捕獲/日誌會增加系統開銷。請配置報告器,使其僅在發生故障時才進行擷取。
  • 禁用動畫(如果可以): 在 Android 系統中,停用開發者選項動畫可以加快 UI 過渡速度,減少不穩定情況和測試時間。 

確保測試可靠性 

不穩定的測試(間歇性故障)是生產力的重大殺手。確保可靠性至關重要。 

  • 穩健的顯性等待(再探討): 始終等待元素變為可交互狀態後再執行操作。提供有意義的資訊。 逾時訊息 用於調試。
  • 穩定定位器(再探): 避免使用動態 ID 或嵌套過深的 XPath,因為它們容易出錯。優先使用輔助功能 ID 或唯一資源 ID。
  • 處理動態元素: 使用 browser.waitUntil 為元素的出現/消失、文字變更或重新排序設定自訂條件。遍歷列表中的元素。
  • 錯誤處理和重試:
    • Try-Catch 區塊: 實現對可能出現嚴重故障的關鍵操作(例如,意外彈出視窗)的優雅失敗處理。
    • 測試重試次數: WebdriverIO 允許設定重試次數 wdio.conf.js 對於不穩定的測試,雖然這只是權宜之計,但即使啟用了重試,也應該調查並修復根本原因。 
 

JavaScript的 

// wdio.conf.js
export const 配置 = {
    // ...
    規格[
        './test/specs/**/*.js'
    ],
    最大實例數: 10,
    // ...
    // 測試失敗後重試的次數
    // 重試次數:1,// 例如:重試一次失敗的測試
    // ...
}; 
  • 隔離測試: 測試應相互獨立。 在每個之前 用於乾淨狀態設定的鉤子和 每個之後 用於清理。
  • 經常且有意義地表達觀點: 每次執行重要操作後,都要斷言預期狀態。使用清晰的斷言訊息(例如, expect(element).toHaveText('歡迎使用儀錶板')).
  • 一致的測試數據: 使用穩定、已知的測試數據。可以考慮使用資料產生器或 API 呼叫進行設置,或使用模擬資料。
  • 定期維護: 測試套件需要持續維護。定期更新定位器,重構舊測試,並刪除過時的測試。
  • 監控 CI/CD 運作: 密切注意您的 CI/CD 管道,立即解決持續出現的故障,並分析回歸或效能瓶頸的趨勢。 

結語 

恭喜!您現在已掌握使用 JavaScript 和現代 WebdriverIO 框架設定和執行強大的 Appium 行動自動化測試的技能。了解 Appium 的架構、進階功能、高效的測試結構和效能最佳化,有助於您避免常見陷阱,從而確保測試的可靠性。現在,您可以建立、調試和維護可擴展的行動測試自動化套件,並將其無縫整合到 CI/CD 管線中,以實現持續的品質保證。 

演示佔位符叢林

串聯共榮。

喬尼·史坦納

您準備好擴大企業規模了嗎?

產品總覽

世界新動態 Digital.ai

2026 年 2 月 3 日

共享而非暴露:測試雲端正在被重新定義

裝置雲的演進:從公有雲到私有雲再到…

瞭解更多
2026 年 1 月 27 日

人工智慧在軟體測試中的應用:炒作、現實以及團隊真正看到投資回報率的地方

如果你相信那些行銷手冊,人工智慧即將…

瞭解更多
2026 年 1 月 21 日

無障礙差距:為什麼僅僅依靠合規性是不夠的

企業為何將「基於掃描的合規性」與真正的可訪問性混淆?原因何在?

瞭解更多