目錄
相關部落格
就是它了!我們為您準備了這份完整的指南,教您如何利用強大的 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) | 真實設備 | |
|---|---|---|
| 優點 |
|
|
| 缺點 |
|
|
許多組織採用混合策略:使用模擬器進行日常快速測試,並預留少量真實設備(內部或雲端)用於接近發佈時的關鍵性、端到端和對效能要求極高的測試。這種策略兼顧了速度、成本和準確性。
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 伺服器的一般流程包括:
- 拉取代碼: 從版本控制系統中取得測試自動化程式碼。
- 安裝依賴項: 安裝 Node.js、Appium 和專案 npm 依賴項。
- 啟動 Appium 伺服器: 本地啟動 Appium 或連接到遠端/雲端伺服器。
- 準備設備/模擬器: 配置 CI 代理程式以啟動 Android AVD、iOS 模擬器或從雲端平台配置真實裝置。
- 執行測試: 使用以下方式執行 WebdriverIO 測試 npm run wdio.
- 生成報告: 執行完畢後發布測試報告(例如 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 管線中,以實現持續的品質保證。