简介
定位策略是用于在自动化测试中定位移动应用界面元素的方法和策略。通过选择合适的定位策略,测试人员可以定位和操作应用程序的各种控件,如按钮、文本框、下拉列表等。常见的定位策略包括 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() 方法。
总结
在选择定位策略时,需要考虑元素的属性、上下文以及应用的特定情况。有时候需要结合多个属性或使用相对定位,以确保定位的准确性和稳定性。此外,使用隐式等待或显式等待是确保元素加载完成的重要步骤,以避免定位超时的问题。