目录
手机参数配置
from appium import webdriver
from appium.webdriver.extensions.android.nativekey import AndroidKey
#运行需要导入上面的库方法
desired_caps = {
'platformName': 'Android', # 被测手机是安卓
'platformVersion': '9', # 手机安卓版本(针对连接的手机填写Andriod版本)
'deviceName': 'xxx', # 设备名,安卓手机可以随意填写,IOS根据具体手机填写
'appPackage': 'tv.danmaku.bili', # 启动APP Package名称(方法见下面文档)
'appActivity': '.ui.splash.SplashActivity', # 启动Activity名称(方法见下面文档)
'unicodeKeyboard': True, # 使用自带输入法,输入中文时填True(如果输入只是拉丁文不用写,为了方便,写哦!)
'resetKeyboard': True, # 执行完程序恢复原来输入法(在执行完操作后查看手机输入法默认为Unicode IME)
'noReset': True,# 不要重置App(如果不操作,手机原来的应用设置会失效,相当于重装应用)
'newCommandTimeout': 6000, #应用的最大超时响应时间
'automationName' : 'UiAutomator2' # 使用的自动化引擎的名称,为了能够支持UiAutomator2,Appium引入了appium-uiautomator2-server(类似driver与Selenium关系)
# 'app': r'd:\apk\bili.apk',要运行的应用解释备注
}
# 连接Appium Server,初始化自动化环境,访问的地址统一如下,为桌面Appium的工具默认访问地址和端口
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
#以下操作同Web自动化
# 设置缺省等待时间
driver.implicitly_wait(5)
# 如果有`青少年保护`界面,点击`我知道了`
iknow = driver.find_elements_by_id("text3")
if iknow:
iknow.click()
# 根据id定位搜索位置框,点击
driver.find_element_by_id("expand_search").click()
# 根据id定位搜索输入框,点击
sbox = driver.find_element_by_id('search_src_text')
sbox.send_keys('python自动化')
# 输入回车键,确定搜索
driver.press_keycode(AndroidKey.ENTER)
# 选择(定位)所有视频标题
eles = driver.find_elements_by_id("title")
for ele in eles:
# 打印标题
print(ele.text)
input('**** Press to quit..')
driver.quit()
查找应用Package和Activity
手机上安装并打开了应用(不要杀掉应用进程),然后在命令行窗口中执行命令:adb shell dumpsys activity recents | find "intent={"
其中显示的cmp中/前的部分为appPackage的值,/后面的部分为appActivity的值。
如果在产品还未正式发布,我们已经有了产品的包,有apk的情况下获取Package和Activity。命令窗口输入如下命令(黄色区域为aapt所在位置,绿色区域为引用包所在位置)查找package名:
E:\Java\Andriod-tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging d:\tools\apk\bili.apk | find "package: name="
输出的信息中就会有package的包名(绿色区域):
package: name='tv.danmaku.bili' versionCode='5531000' versionName='5.53.1' platformBuildVersionName='5.53.1' compileSdkVersion='28' compileSdkVersionCodename='9'
输入下面命令查找启动的Activity:
E:\Java\Andriod-tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging d:\tools\apk\bili.apk | find "launchable-activity"
输出结果信息(其中前面一部分为包名,后面一部分为Activity,代码中可以选择全写):
launchable-activity: name='tv.danmaku.bili.ui.splash.SplashActivity' label='' icon=''
出错解决
运行时需要打开打开桌面程序Appium工具出现如下界面,正确信息:
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
运行出错,手机没有反应:OPPO手机开发者选项中打开”禁止权限监控”
首次运行时,手机弹出安装相关应用或程序,选择安装,如Appium Settings。
定位元素
代码规则
Appium和Selenium Web中的操作一样,先选择定位元素再操作元素。
Appium基于Selenium,所以代码的定位元素的基本方法相同:
- Find_element_by_xxx方法,返回符合条件的第一个元素,找不到元素抛出异常
- Find_elements_by_xxx方法,返回符合条件的所有元素的列表,找不到元素返回空列表
- 通过WebDriver对象调用这样的方法,查找范围是整个界面
- 通过WebElement对象调用这样的方法,查找范围是该节点的子节点
界面元素查看工具
在WEB中可以通过浏览器的开发者工具栏定位查看元素为位置及属性,在APP手机应用中同样也有查看元素位置及属性特征的工具: Android Sdk包中的 uiautomateviewer 和 Appium Desktop 中的 Appium Inspector
uiautomateviewer
uiautomateviewer是Andriod SDK中的工具,它的位置在SDK目录下的tools\bin下。
操作步骤:
- 连接手机在开发者模式下,打开应用界面(定位元素的界面)
- 双击tools\bin下的uiautomateviewer,出现下面的工具窗口和命令窗口(不要关闭开启的命令窗口,否则uiautomateviewer工具操作窗口也会关闭)
- 寻找元素:点击上图中黄色箭头所指的图标,获取手机端应用界面,如下(获取到正在打开的微信通讯录界面)【左边界面中移动鼠标对应的元素会出现红色虚线框;右边上方显示元素的坐标位置(坐标位置显示中前面的定位点为红色框的左上方位置坐标,后面的定位点为红色框的右下方位置坐标);右边下方位置显示的内容为元素的具体属性特征信息,如ID/class等】
- 选中元素:点击定位达到的元素,使红色虚线框变为实线框,在右边下方的栏中查看元素
- 重新获取界面,当手机上的界面切换后,想要获取新的界面进行元素定位时,只需要和刚开始的操作一样,点击上图所示的绿色箭头所指的绿色框中的获取界面按钮即可。
【保存当前获取的界面存放到本机中,下次同样界面信息时可以直接从本机中获取,不需要使用手机。可以对每一个界面命名建立不同的文件夹方便调用,如本机中获取到微信通讯录界面的信息,保存在桌面文件夹微信通讯录中,一个界面图片对应一个.uix的界面元素信息文件】
方法:在手机上获取到当前界面后,点击下图中蓝色框中的保存按钮,选择合适的文件夹(最好是在保存前就创建好文件夹)保存,下次需要重新打开界面查找元素的时候,点击绿色框中的打开文件夹的按钮,弹出下面窗口,通过点击红色框选择要打开查找的文件,Screenshot选择的界面对应的图片,UI XML Dump选择的是存放界面元素信息的文件,完成后点击OK即可打开进行定位操作。
Appium Inspector
Appium Desktop中的Appium Inspector也可以用来查找界面元素,其优点就是可以直接验证选择的表达式是否能定位到元素。
操作步骤
- 连接好手机,处于开发者模式下。
- 打开Appium工具,启动Appium Server,点击红色框中放大镜查找的按钮。
- 弹出如图窗口:窗口中红色框中的参数设置与自动化代码中的一致,黄色框中为对应的参数名,参数数据类型(根据不同的参数类型选择),参数值。右边绿色框中会根据左边框中设置的参数自动生成JSON格式的参数字典,如果已经有了JSON格式的参数字典,可以点击蓝色框中编辑按钮复制过去。
- 启动与保存:如图,点击红色框中的保存按钮,下次操作的时候直接使用已经设置好的参数文件。点击右边的橙色框中启动按钮,就可以打开手机上对的应用,如下面打开B站的结果。
- 查找元素:选择图中所示功能按钮中的查找元素的功能后,当鼠标移动到界面对应的位置时,会高亮显示为黄色,如图中的搜索框。
- 定位元素:点击查找到的元素的黄色高亮区域,会最终变为蓝色,对应的右边也会显示出元素对应的id等信息,如下图:
元素属性
NAF:true 输入框不能输入字符
index:表示父节点的第几个子节点
resource_id:类似于id
text:文本信息
class:类似于标签名与class
package:包名
content-desc:节点描述信息
checkable :是否是可选择的
checked:是否是已选择的
clickable:是否是可点击的
enabled:可用状态
focusable:是否可以聚焦
focused:是否是聚焦状态的
scrollable:是否是可滚动的
long-clickable:是否可长按
bounds:坐标 左上角和右下角