10.自动化测试定位策略

发布时间 2023-12-19 16:53:53作者: 想要暴富的小男孩

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 的路径(不推荐,存在性能问题)

App 定位方式进阶

 
定位策略描述
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
  • 其它定位

元素定位不到

原因解决方案
定位不正确 在定位工具中先测试定位表达式是否正确
存在动态 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 完成元素定位
  • 结合 隐式等待

下拉框/日期控件定位 

  • 场景:

    • <input>标签组合的下拉框无法定位
    • <input>标签组合的日期控件无法定位
  • 解决:

  • 面对这些元素,我们可以引入 JS 注入技术来解决问题。

文件上传定位

  • 场景:
    • input 标签文件上传
  • 解决:
  • input 标签直接使用 send_keys()方法