Android APP的元素定位和操控

App的元素定位

由于Appium是在Selenium的基础上进行封装,所以Appium的元素定位与操作采用了Selenium的部分方法。首先要学习的就是元素的查找方法,我们还是接着上一篇文章进行说明。Android系统的元素查找需要借助UI Automator Viewer实现。这里以TapTap软件为例,进行介绍。基本流程如下:


1. 将手机与计算机进行连接,连接之前确保手机已开启USB调试模式。 2. 唤醒手机屏幕,当手机界面出现USB调试提示信息时,单击“确定”按钮并打开手机的TapTap。 3. 打开软件UI Automator Viewer,单击“DeviceScreenshot”按钮捕捉手机当前界面。 4. 捕捉成功后,在软件的左侧会出现手机界面的截图。相关属性都会展示在软件的右侧,这些属性就是我们所需的元素属性。

假设我现在想定位搜索按钮,它一共有17个,但是只有5个属性能用于元素定位,它们分别是indextextresource-idclasscontent-desc

一般来说使用UI Automator Viewer进行元素定位,会出现报错,这个算是搞得鳄鱼君Ba头皮发麻!这里鳄鱼君Ba不使用DeviceScreenshot实时获取屏幕截图,而是通过命令将截图和xml保存在本地,然后选择添加文件进行元素定位。

创建一个文本文件,在添加以下代码之前,需要在E盘创建app.uix和app.png文件夹用于保存xml和截图:

adb shell uiautomator dump /sdcard/app.uix
adb pull /sdcard/app.uix E:/app.uix
adb shell screencap -p /sdcard/app.png
adb pull /sdcard/app.png E:/app.png

将文本文件另存为.bat,放置到桌面上,需要定位元素的时候运行即可。若没有xml文件,重试几次就可以了!目前这种方式相对于DeviceScreenshot还是方便的。

那么,Appium对搜索按钮的定位方法如下:

# 通过index定位
# 通过Appium的uiautomator方法
index='0'
ua='new UiSelector().index('+index+')'
driver.find_element_by_android_uiautomator(ua).click()

# 通过text定位
# 通过Appium的uiautomator方法

text=''
ua='new UiSelector().text("'+text+'")'
driver.find_element_by_android_uiautomator(ua).click()

# 通过resource-id定位
resourceId='com.taptap:id/right_search'
# Selenium的方法
driver.find_element_by_id(resourceId)
# Appium的uiautomaotr方法
ua='new UiSelector().resourceId("'+resourceId+'")'
driver.find_element_by_android_uiautomator(ua).click()

# 通过class定位
# Selenium方法
class_name='android.widget.ImageView'
driver.find_elements_by_class_name(class_name)

# 通过content-desc定位
# 通过Appium的uiautomator方法
description=''
ua='new UiSelector().description("'+description+'")'
driver.find_element_by_android_uiautomator(ua).click()
# 方法er
driver.find_element_by_accessibility_id('').click()


# xpath定位
xpath='//android.widget.ImageView'
driver.find_element_by_xpath(xpath).click()

元素定位主要使用了Selenium的方法和Appium的uiautomator方法实现,在5个属性中,除了元素属性class之外,其余4个元素属性都能使用Appium的uiautomator方法进行定位,Selenium的方法只适用于class和resource-id属性,而Selenium的Xpath方法是根据元素的布局进行定位,它能用于任何Android应用程序。对于空值需要灵活选择定位方式。

App的元素操控

通过上面的代码可以发现,在定位后的元素都执行了单击处理,该操作由click()方法实现。当我们使用手机的时候,使用过程中大多数操作都是单击(click方法)、文本输入(send_keys方法)和滑动(swipe方法)。下面主要介绍文本输入和滑动操作。

这里以还是TapTap为例进行说明,还是按照流程,进行定位,然后点击搜索按钮会进入一个搜索页面,在搜索页面可以输入鲜果的搜索内容

我们要对图中两个文本框进行定位并操控,第一个文本框是进行单击操控,第二个文本框是进行文本输入操作,具体的实现代码如下:

在代码中,字典desired_caps额外设置了参数unicodeKeyboard和resetKeyboard,前者是将键盘输入内容改为unicode格式,后者是将手机的输入法改为Appium的输入法。只有同时设置这两个参数,Appium才能在手机上输入中文内容,否则输入的内容就会变成乱码。 Appium在运行Android应用程序的时候,应用程序在启动时是处于一种初始化的状态,也就是说Appium清除了用户在这个应用上的使用痕迹。当Android应用程序启动成功后,系统会出现相应的系统提示框,因此在执行自动化操作之前,还需要对这些系统提示进行相应的处理才能执行下一步的操作。 Appium的滑动操作可以分为上滑、下滑、左滑和右滑,不管哪一种滑动,它们都是由swipe()方法实现,只要对swipe()方法传入不同的参数就能实现不同的滑动方式,swipe()方法的定义如下: 从swipe()方法定义可以看到,滑动屏幕需要借助屏幕上的坐标位置,由于每台手机的分辨率和尺寸大小不同,如果将滑动位置设为一个固定的坐标,在其他手机上不一定能适用,所以只能够根据手机的屏幕大小来制定滑动位置。Appium提供了相应的方法来获取手机屏幕的尺寸大小,实现过程如下: 函数getSize()是我们自定义的函数,在函数中使用了Appium的get_window_size()方法来获取手机屏幕分辨率。每台手机的坐标点都是从左上方为起点,右下方为终点,这与计算机屏幕分辨率的坐标点分

发表评论