app自动化——常见控件定位方法

一、android/ios 基础知识

1.1、Android基础知识

Android是通过容器的布局属性来管理子控件的位置关系,布局关系就是把界面上的所有空间根据他们的间距大小,摆放在正确的位置

  • 布局

    • 是可用于放置很多控件的容器按照一定的规律调整内部控件的位置由此构成界面。
  • 嵌套布局

    • 布局内部放置布局,多层布局嵌套,可以完成复杂的界面结构
  • Android七大布局

    • LinerLayout(线性布局)
    • RelativeLayout(相对布局)
    • FrameLayout(帧布局)
    • AboluteLayout(绝对布局)
    • TableLayout(表格布局)
    • GridLayout(网格布局)
    • ConstraintLayout(约束布局)
  • Android四大组件

    • Acitvity:与用户交互的可视化界面
    • server:实现程序后台运行的解决方案
    • content provide:内容提供者,提供程序所需要的数据
    • broadcast receiver:广播接收器,监听外部事件的到来
  • 常用控件

    • TextView(文本控件),
    • EditText(可编辑文本控件)
    • Button(按钮)
    • ImageButton(图片按钮)
    • ToggleButton(开关按钮)
    • ImageView(图片控件)
    • CheckBox(复选框控件)
    • RadioButton(单选框控件)

1.2、ios 基础知识

  • 布局
    • iOS 不使用布局的概念,用变量之间的相对关系完成位置的计算
  • 注意
    • 使用 Appium 测试 iOS 应用需要使用 MacOS 操作系统

二、dom 结构解读

2.1、元素定位

  • 概念:元素定位的含义就是定位控件
  • 注意:同一脚本同时支持 android/iOS 两个系统的前提是元素属性(id,aid,xpath 等)一致

2.2、控件基础知识1

  • dom:Document Object Model 文档对象模型
  • dom 应用:用于表示界面的控件层级,界面的结构化描述
    • 常见的格式:html、xml
    • 核心元素:节点、属性
  • xpath:xml 路径语言,用于 xml 中的节点定位

2.3、控件基础知识2

  • Anrdroid 应用的层级结构与 html 不一样,是一个定制的 xml

  • app source 类似于 dom ,表示 app 的层级,代表了界面里面所有的控件树的结构

  • 每个控件都有它的属性(resourceid,xpath,aid),但是没有 css 属性

  • node

  • attribute

    • clickable
    • content-desc
    • resource-id
    • text
    • bounds

2.4、iOS 与 Android dom 结构的区别

  • dom 属性和节点结构类似
  • 名字和属性命名不同
    • android 的 resourceid 和 ios 的 name
    • android 的 content-desc 和 ios 的 accessibility-id

2.5定位方法

  • 测试步骤三要素
    • 定位、交互、断言
  • 定位方式:
    • id 定位
    • accessibilty_id 定位
    • xpath 定位
    • classname 定位(不推荐)

三、常见的控件定位方法

3.1、app定位方式

定位策略 描述
Accesibility ID 识别一个唯一的UI元素,对于XCUITest引擎,它对应的属性名是accessibility-i;对应Android系统的页面元素,对应的属性名是content-desc
Class name 对于IOS系统,它的class属性对应的属性值会议XCUIElementType开头;对应Android系统,它对应的是UIAutomator2的class属性(eg:android.widget.TextView)
ID 原生的标识符,Android对应的属性名为resource-id,ios为name
Name 元素的名称(已取消)
XPATH 使用XPATH表达式查找页面所对应的xml路径(不推荐,性能不稳定)

3.2、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 框架查找元素

3.3、选择定位器通用原则

  • 与研发约定的属性优先
    • android 推荐 content-description
    • ios 推荐 label
  • 身份属性 id
  • 组合定位 xpath,css
  • 其它定位

元素定位的写法

  • 返回单个元素 WebElement
  • 返回元素列表 [WebElement, WebElement, WebElement…]
# 返回单个元素 WebElement
driver.find_element(AppiumBy.xxx, "xxx属性值")
# 返回元素列表 [WebElement, WebElement, WebElement...]
driver.find_elements(AppiumBy.xxx, "xxx属性值")
driver.find_element(AppiumBy.ID, "ID属性值")
driver.find_element(AppiumBy.XPATH, "xpath表达式")
driver.find_element(AppiumBy.CLASS_NAME, "CLASS属性值")
driver.find_element(AppiumBy.ACCESSIBILITY_ID, "ACCESSIBILITY_ID表达式")
driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, "android uiautomator 表达式")
driver.find_element(AppiumBy.IOS_UIAUTOMATION, "ios uiautomation 表达式")
driver.find_element(AppiumBy.ANDROID_VIEWTAG, "ESPRESSO viewtag 表达式")
driver.find_element(AppiumBy.ANDROID_DATA_MATCHER, "ESPRESSO data matcher 表达式")
driver.find_element(AppiumBy.IMAGE, "IMAGE图片")