Appium
1.1 App基础操作 API
完成app自动化需要一些基础条件的支持:APP初始化API
1.1.2 基础操作命令
1. 前置代码
# 导入driver对象
from appium import webdriver
import time
# server 启动参数
desired_caps = {}
# 设备信息(系统、版本、设备号)
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '9'
desired_caps['deviceName'] = '192.168.72.103:5555'
# app信息(包名、启动名)
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
# 声明driver对象
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(5)
# 关闭驱动对象
driver.quit()
2. 操作与命令
操作 | 命令 |
---|---|
安装APK到手机 (调用driver) |
driver.install_app(app_path) 参数: app_path(脚本机器中APK文件路径) x:/xxx.apk 注意: 必须是绝对路径且是 / eg: driver.install_app(‘D:/PycharmProjects/test/apk/Greenify.apk‘)
|
安装APK到手机 (调用adb) |
import os os.system("adb install 路径") 参数: app_path(脚本机器中APK文件路径) 格式: x:/xxx.apk 或x/xxx.apk eg: os.system("adb install apk/Greenify.apk")
|
手机中移除APP |
driver.remove_app(app_id) 参数: app_id(需要卸载的app包名) 提醒: 包名/启动名获取: adb shell dumpsys window windows \| grep mFocusedApp \| cut -d " " -f 7
|
判断APP是否已安装 |
driver.is_app_installed(bundle_id) 参数: bundle_id 可以传入app包名,返回结果为True(已安装) / False(未安装) |
发送文件到手机 |
import base64 base64编码-encode data = str(base64.b64encode(data.encode(‘utf-8‘)),‘utf-8‘) driver.push_file(path,data) 参数: path:手机设备上的路径(例如:/sdcard/a.txt) data:文件内数据,要求base64编码 Python3.x中字符都为unicode编码,而b64encode函数的参数为byte类型,需要先转码 生成的数据为byte类型,需要将byte转换回去 |
从手机中拉取文件 |
import base64 返回数据为base64编码 data = driver.pull_file(path) base64解码-decode print(str(base64.b64decode(data),‘utf-8‘)) 参数: path: 手机设备上的路径 |
获取当前屏幕内元素结构 |
driver.page_source 作用: 返回当前页面的文档结构,判断特定的元素是否存在 不包括需要滚动才看到的页面 |
参阅:
3. 应用
- 判断APP是否安装,存在则卸载,不存在则安装
# 判断APP是否安装,存在则卸载,不存在则安装
if driver.is_app_installed("com.oasisfeng.greenify"):
driver.remove_app("com.oasisfeng.greenify")
else:
driver.install_app("D:/PycharmProjects/test/apk/Greenify.apk")
- 判断当前设置页面是否有"网络和互联网"和 "电池"
# 获取当前页面内的元素结构
current_page_data = driver.page_source
for i in ("网络和互联网", "电池"):
if i in current_page_data:
print("True")
else:
print("False")
4. 整理与总结
- 初始化
vim initDriver.py
from appium import webdriver
import os
def init_driver():
desired_caps = {
# 系统
'platformName': 'Android',
# 版本
'platformVersion': '9',
# 设备号
'deviceName': 'os.system("adb devices")|sed -n "2p"|cut -d " " -f 1',
# 包名
'appPackage': 'com.android.settings',
# 启动名
'appActivity': '.Settings',
# 安装的APP
# 'app': 'apk/xx.apk',
}
# 声明手机驱动对象
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
return driver
- 主程序
vim main.py
from init_driver.initDriver import init_driver
import os
import time
import base64
def push_myfile(tag, pc_path, phone_path, driver=None):
# 电脑发送文件给手机
# tag=1调用adb,tag=2调用appium
if tag == 1:
os.system("adb push %s %s" % (pc_path, phone_path))
if tag == 2:
with open(pc_path, 'r') as f:
data = str(base64.b64encode(f.read().encode('utf-8')), 'utf-8')
driver.push_file(phone_path, data)
# def install_myapp(tag, path):
if __name__ == '__main__':
driver = init_driver()
# adb方式校验
push_myfile(tag=1, pc_path="hello.txt", phone_path="/sdcard/test.txt")
# Appium方式校验
push_myfile(tag=2, pc_path="hello.txt", phone_path="/sdcard/test.txt", driver=driver)
driver.quit()
1.2 手机控件查看工具uiautomatorviewer
用来扫描和分析Android应用程序的UI控件的工具
1.2.1 uiautomatorviewer使用
1. 使用工具
- 确保模拟机打开且没有连接上ADB
adb kill-server
- 运行批处理文件
- 效果
2. Q&A
(1) 使用SDK自带的uiautomatorviewer.bat调用uiautomatorviewer.jar打开Ui Aotumator Viewer程序容易产生以下问题:
产生原因:
真机或模拟机的安卓系统版本与uiaotumatorviewer.jar的兼容性问题
解决方法(已成功):
参阅:
名称 | Windows的说明 |
---|---|
相关工具 |
https://www.lanzous.com/b944571/5kx9
|
uiautomatorviewer.jar |
下载后,进入 xxx/android-sdk/tools/lib 目录先备份原来的jar包,再复制下载的jar包到该目录中 |
LvmamaXmlKit.jar |
将该文件发送到手机的/data/local/tmp/ 中adb push LvmamaXmlKit.jar /data/local/tmp/ 验证: adb shell ls /data/local/tmp |
ADBKeyBoard.apk |
将该文件发送到手机的/sdcard 中adb push ADBKeyBoard.apk /sdcard 重启手机,运行uiaotumatorviewer.bat即可 |
参阅:
- 更换默认输入法
参阅:
更新中......