簡介
定位策略是用於在自動化測試中定位移動應用界面元素的方法和策略。通過選擇合適的定位策略,測試人員可以定位和操作應用程序的各種控件,如按鈕、文本框、下拉列表等。常見的定位策略包括 ID 定位、XPath 定位、Class Name 定位、AccessibilityID 定位、Name 定位、XPath 模糊定位、Android UI Automator 定位以及 iOS Predicate 定位。通過靈活運用不同的定位策略,可以提高自動化測試的穩定性和可靠性。
App 定位方式
定位策略 | 描述 |
---|---|
Accessibility ID | 識別一個唯一的 UI 元素,對於 XCUITest 引擎,它對應的的屬性名是 accessibility-id,對於 Android 系統的頁面元素,對應的屬性名是 content-desc |
Class name | 對於 iOS 系統,它的 class 屬性對應的屬性值會以XCUIElementType開頭,對於 Android 系統,它對應的是 UIAutomator2 的 class 屬性(e.g.: android.widget.TextView) |
ID | 原生元素的標識符,Android 系統對應的屬性名爲resource-id,iOS 爲name |
Name | 元素的名稱 |
XPath | 使用 xpath 表達式查找頁面所對應的 xml 的路徑(不推薦,存在性能問題) |
Image | 通過匹配 base 64 編碼的圖像文件定位元素 |
Android UiAutomator (UiAutomator2 only) | 使用 UI Automator 提供的 API, 尤其是 UiSelector 類來定位元素,在 Appium 中,會發送 Java 代碼作爲字符串發送到服務器,服務器在應用程序的環境中執行這段代碼,並返回一個或多個元素 |
Android View Tag (Espresso only) | 使用 view tag 定位元素 |
Android Data Matcher (Espresso only) | 使用 Espresso 數據匹配器定位元素 |
IOS UIAutomation | 在 iOS 應用程序自動化時,可以使用蘋果的 instruments 框架查找元素 |
Web 定位方式
定位策略 | 描述 |
---|---|
class name | 通過 class 屬性定位元素 |
css selector | 通過匹配 css selector 定位元素 |
id | 通過 id 屬性匹配元素 |
name | 通過 name 屬性定位元素 |
link text | 通過 text 標籤中間的 text 文本定位元素 |
partial link text | 通過 text 標籤中間的 text 文本的部分內容定位元素 |
tag name | 通過 tag 名稱定位元素 |
xpath | 通過 xpath 表達式匹配元素 |
選擇定位器通用原則
- 與研發約定的屬性優先 。
-
- web 推薦 class。
- android 推薦 content-description。
- ios 推薦 label。
- 身份屬性 id,name(web 定位)。
- 組合定位 xpath,css。
- 其它定位。
元素定位不到
導致 Appium 元素定位不到的原因可能包括定位信息錯誤、元素未加載完成、元素隱藏或不可見、元素定位策略不準確、Appium 和應用程序版本不兼容以及設備連接或設置問題。要解決這些問題,需要確保定位信息正確、等待元素加載完成、使元素可見、選擇合適的定位策略、確保版本兼容性以及正確配置和設置設備。
原因 | 解決方案 |
---|---|
定位不正確 | 在定位工具中先測試定位表達式是否正確 |
存在動態 ID | 定位方式使用 css 或者 xpath 的相對定位 |
頁面還沒有加載完成 | 添加死等驗證,使用顯式等待或隱式等待進行優化 |
頁面有 iframe | 切換到 iframe 後定位 |
頁面切換 window | 切換到對應窗口後定位 |
要定位元素爲隱藏元素 | 使用 js 操作該元素 |
混合定位的應用場景
- 場景:
-
- 屬性動態變化(id,text)。
- 重複元素屬性(id,text,class)。
- 解決:
-
- 根據相對位置關係進行定位(css、xpath)(父級,子級,兄弟,索引)。
- 使用 find_elements 遍歷查找。
- 參考高級定位技巧章節(xpath,css)。
使用等待機制的場景
- 場景
-
- 控件動態出現
- 控件出現特定特徵
- 解決
-
- 元素定位結合隱式等待與顯式等待
特殊控件定位
Web 彈框定位
- 場景
-
- web 頁面 alert 彈框
- 解決:
-
- web 需要使用 driver.switchTo().alert() 處理
App toast 提示框定位
- 場景:
-
- app Toast 提示框。
- 解決:
-
- 使用 driver.page_source 拿到頁面佈局結構文件,分析 Toast/彈框組件的標籤內容。
- 然後通過 id/text/class 等屬性,使用 xpath 完成元素定位。
- 結合隱式等待。
下拉框/日期控件定位
- 場景:
-
- 標籤組合的下拉框無法定位。
- 標籤組合的日期控件無法定位。
- 解決:
-
- 面對這些元素,可以引入 JS 注入技術來解決問題。
文件上傳定位
- 場景:
-
- input 標籤文件上傳。
- 解決:
- input 標籤直接使用 send_keys() 方法。
總結
在選擇定位策略時,需要考慮元素的屬性、上下文以及應用的特定情況。有時候需要結合多個屬性或使用相對定位,以確保定位的準確性和穩定性。此外,使用隱式等待或顯式等待是確保元素加載完成的重要步驟,以避免定位超時的問題。