Appium-APP自动化测试三:APP定位

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 框架查找元素
定位策略描述Accessibility ID识别一个唯一的 UI 元素,对于 XCUITest 引擎,它对应的的属性名是 accessibility-id,对于 Android 系统的页面元素,对应的属性名是 content-descClass name对于 iOS 系统,它的 class 属性对应的属性值会以XCUIElementType开头,对于 Android 系统,它对应的是 UIAutomator2 的 class 属性(e.g.: android.widget.TextView)ID原生元素的标识符,Android 系统对应的属性名为resource-id,iOS 为nameName元素的名称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 框架查找元素

安装 ApiDemo.apk - 链接: 百度网盘 请输入提取码 密码: gdcw
打开应用
定位文字为【App】元素
Android 原生定位-单属性定位
官网地址:UiSelector  |  Android Developers
元素属性定位
ID 定位
文本定位
文本匹配定位
父子关系定位
兄弟关系定位
格式 'new UiSelector().属性名(“<属性值>”)'比如:‘new UiSelector().resourceId(“android:id/text1”)’
先创建一个uiselector的对象 new UiSelector
注意外面是单引号,里面是双引号,顺序不能变
可以简写为 属性名(“<属性值>”)'比如:·resourceId(“android:id/text1”)
多个属性同时确定元素的(多个属性任意组合 ,不限长度)

单属性定位

ID 定位

def test_android_uiautomator_by_id(self):
print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,
‘new UiSelector().resourceId(“android:id/text1”)’))

TEXT 定位

def test_android_uiautomator_by_text(self):
print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,
‘new UiSelector().text(“App”)’))

classname 定位

def test_android_uiautomator_by_className(self):
print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR,
‘new UiSelector().className(“android.widget.TextView”)’))

Android 原生定位-多属性定位
driver.find_element_by_android_uiautomator(’
new UiSelector().resourceId(“com.xueqiu.android:id/tab_name”).
text(“我的”)')

模糊匹配
文字包含
文字以 x 开头
文字正则匹配

模糊匹配

def test_android_uiautomator_by_text_contains(self):
print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, ‘new UiSelector().textContains(“ssi”)’).text)

def test_android_uiautomator_by_text_start_with(self):
print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, ‘new UiSelector().textStartsWith(“Ani”)’).text)

def test_android_uiautomator_by_text_match(self):
print(self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, ‘new UiSelector().textMatches(“^Pre.*”)’).text)

Android 原生定位-层级定位
兄弟元素定位 fromParent
父子结点定位 childSelector, 可以传入 resourceId() , description() 等方法

查找目标元素Text,先找App ,fromParent() 方法可以查找兄弟结点

new UiSelector().text(“App”).fromParent(text(“Text”))

根据父结点查找子结点/ 子孙结点

new UiSelector().className(“android.widget.ListView”).childSelector(text(“Text”))
滑动查找元素
new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text(“查找的元素文本”).instance(0))