目录
元素定位方法
根据ID
根据CLASS NAME
根据ACCESSIBILITY ID
XPath定位
安卓UIAutomator
元素操作
其他操作
通知栏
adb 命令
自动化常用adb命令
shell
内嵌H5操作
同Selenium的定位方法相同,ID属性一般唯一,在安卓应用元素中,这个ID信息为resource-id属性,使用的代码为.find_element_by_id()
安卓界面的class属性其实是根据元素的类型,类似于web中的tagname(标签名)属性,所以通常并不唯一,因此,根据classs属性来选择元素时,通常是选择多个具有这一属性的元素,使用.find_elements_by_class_name(),结果为列表存放。
使用class属性时选择所有全程信息,如果只选择如下图中.TextView,无法定位到元素
元素的content-desc属性是用来描述该元素作用的,如果要查询的界面元素有content-desc属性,我们可以通过它来选择定位元素,代码为.find_element_by_accessibility_id()
在Web中的xpth中语法完全适用于Appium。在Appium中选择的节点标签名class属性,不同于Web中的tagname。
前面的几种选择元素的方法,其底层都是利用安卓uiautomator框架的API功能实现的。参考安卓官方文档:UiSelector | Android Developers
程序的这些定位请求被Appium server转发给手机自动化代理程序,就会转化为uiautomator里面相应的定位函数调用API的java代码。
code = 'new UiSelector().text("热").className("android.widget.TextView")'
ele = driver.find_element_by_android_uiautomator(code)
ele.click()
在python自动化代码中,使用java先new一个方法UiSelector(),然后调用这个方法中的函数,上面代码中绿色标记的为使用uiautomator函数的固定格式,new UiSelector()后面的跟的是元素的属性特征方法,属性值一定用双引号(java方法),常用的几种方法如下,具体的方法属性访问上面网址。
Code = 'new UiSelector().resourceId("tv.danmaku.bili:id/recycler_view").childSelector(new UiSelector().className("android.widget.TextView"))'
目前有bug:只能找到符合条件的第一个元素,参考appium 在github上的 issues:https://github.com/appium/java-client/issues/150
前面4个参数是滑动起点和终点的x、y坐标。第5个参数duration是滑动从起点到终点坐标所耗费的时间。【注意这个时间非常重要,在屏幕上滑动同样的距离,如果时间设置的很短,就是快速的滑动。比如:一个翻动新闻的界面,快速的滑动,就会是扫动的动作,会导致内容惯性滚动很多。】
from appium.webdriver.extensions.android.nativekey import AndroidKey
driver.press_keycode(AndroidKey.ENTER) # 输入回车键,确定搜索
按键的定义,可以参考这篇文档:https://github.com/appium/python-client/blob/master/appium/webdriver/extensions/android/nativekey.py
from appium.webdriver.common.touch_action import TouchAction
actions = TouchAction(driver)
actions.long_press(element)
actions.perform()
参考源代码中的注释:https://github.com/appium/python-client/blob/master/appium/webdriver/common/touch_action.py
# 创建手机驱动服务对象
d = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 启动其他应用包,两个参数:包名、应用appActivity名
d.start_activity('','')
# 安装包app,参数为app包的位置及名称
d.install_app('/')
# 判断是否已经安装了app,参数为包名
d.is_app_installed('')
# 获取页面page文档,如同web中的HTML文档
page = d.page_source
# 卸载app,参数为包名
d.remove_app('')
# 关闭app
d.close_app()
# 通过元素的坐标点击元素,参数1:为一个列表(列表的之为两对坐标,见元素的bounds属性);参数2:点击行为持续的时间
d.tap([(540,1764),(1080,1920)],300)
# 打开通知栏
d.open_notifications()
# 返回操作
d.back()
# 退出手机驱动对象
d.quit()
在android sdk里面的命令行工具 adb 。
adb全程 Android Debug Bridge,这个adb使用非常广泛。它可以与Android手机设备进行通信,它可进行各种设备操作。比如:安装应用和调试应用,传输文件,甚至登录到手机设备上shell的进行访问,就像远程登录一样。这个adb在sdk的platform-tools目录下面,安装时确保路径在path环境变量中。
Appium对anroid的自动化就非常依赖这个adb工具。执行自动化过程中,有很多内部操作,比如获取设备信息,传送文件到手机,安装apk,启动某些程序等,都是通常这个adb实现的。
命令可以使用Python的 os.system() 或者 subprocess 来自动化调用它,完成我们的各种自动化需求。比如,我们自动化过程中,可能需要截屏手机,并且下载到指定目录中,就可以在我们的Python程序中这样写:
import os
os.system('adb shell screencap /sdcard/screen3.png && adb pull /sdcard/screen3.png')
特别是,还可以通过adb 使用 am(activity manager) 和pm (package manager) 两个工具, 可以启动 Activity、强行停止进程、广播 intent、修改设备屏幕属性、列出应用、卸载应用等。更多adb命令参考:https://developer.android.google.cn/studio/command-line/adb.html#devicestatus
查看连接的设备:adb devices -l
查看目录:adb shell ls /sdcard
上传:adb push wv.apk /sdcard/wv.apk
下载:adb pull /sdcard/new.txt
截屏:adb shell screencap /sdcard/screen.png
截屏后的文件存在手机上,可以使用 adb pull 下载下来
登录到手机设备上shell的进行访问,就像远程登录一样,可用来在连接的设备上运行各种命令。可以执行一下 adb shell 然后执行各种安卓支持的Linux命令,比如ps、netstat、netstat -an|grep 4724、pwd、ls、cd、rm 等。 执行quit退出 shell
参考:appium微信公众号H5页面自动化测试 - ☆星空物语☆ - 博客园
https://www.jianshu.com/p/3d817925e6d2
http://www.python3.vip/tut/auto/appium/04/