adbui,最简单的安卓自动化
前言:一直想找一行cmd命令就能获取某个元素的text或者根据xpath、text去定位点击元素的方法,一直没能找到,但adbui不错,已经很接近了。
源码:https://github.com/hao1032/adbui
adbui 所有的功能都是通过 adb 命令实现,但adbui 的特色是可以通过 xpath,text,ocr等方式获取 ui 元素,而不需要像uiautomator2或appium等成熟的工具那种在手机上部署相关服务器端或server。
1、adbui的安装:
pip install adbui
2、使用
from adbui import Device d = Device('123abc')
3、adb、cmd、shell命令的封装,就没什么好说的了,官网自己看或者自己封装也行
4、获取元素的方法:
ui = d.get_ui_by_attr(text='设置', desc='设置') # 支持多个属性同时查找 ui = d.get_ui_by_attr(text='设', is_contains=True) # 支持模糊查找 ui = d.get_ui_by_attr(text='设置', is_update=False) # 如果需要在一个界面上获取多个 UI, 再次查找时可以设置不更新xml文件和截图,节省时间 ui = d.get_ui_by_attr(class_='android.widget.TextView') # class 在 python 中是关键字,因此使用 class_ 代替 ui = d.get_ui_by_attr(desc='fffffff') # 如果没有找到,返回 None;如果找到多个返回第一个 ui = d.get_uis_by_attr(desc='fffffff') # 如果是 get uis 没有找到,返回空的 list
5、by ocr 使用腾讯的OCR技术来获取
d.init_ocr('10126986', 'AKIDT1Ws34B98MgtvmqRIC4oQr7CBzhEPvCL', 'AAyb3KQL5d1DE4jIMF2f6PYWJvLaeXEk') # 使用 ocr 功能前,必须要使用自己的开发密钥初始化,上面的密钥是我申请的公共测试密钥,要稳定使用请自行申请 # 腾讯的 ocr 功能是免费使用的,需要自己到 http://open.youtu.qq.com/#/develop/new-join 申请自己的开发密钥 btn = d.get_ui_by_ocr(text='爱拍') # 找到爱拍文字的位置 btn.click() # 点击爱拍
以下是我简单二次封装的demo:
from adbui import Device from time import sleep import sys import os device = sys.argv[1] class Adbui(object): def __init__(self): self.d = Device(device) def cmd(self, command): """执行cmd命令""" self.d.util.cmd(command) def adb(self, adb_cmd): """执行adb命令""" self.d.util.adb(adb_cmd) def shell(self, shell_cmd): """执行shell命令""" self.d.util.shell(shell_cmd) def get_model(self): """获取手机型号""" return os.popen('adb -s %s shell getprop ro.product.model' % device).read() def test(self): """执行测试用例""" model = self.get_model() self.shell('am force-stop com.huawei.systemmanager') sleep(1) self.shell('am start -n xxx') sleep(1) self.shell('am start -n xxx') sleep(1) self.shell('am start -n xxx') sleep(1) try: self.d.get_ui_by_attr(text='RCTestKit').click() except: print('当前列表中没有RCTestKit!') sleep(1) self.shell('input swipe 360 800 360 600') # 滑动一下界面以显示耗电数据 battery = self.d.get_ui_by_attr(text='mAh', is_contains=True).text self.shell('screencap -p /sdcard/battery.png') if ':' in device: device_str = device.split(':')[0] self.cmd('rmdir /s/q %s' % device_str) self.cmd('mkdir %s' % device_str) print(battery) with open('./%s/battery.txt' % device_str, 'w') as f: f.write(model + '\r' + battery) sleep(2) self.adb('pull /sdcard/battery.png ./%s' % device_str) else: self.cmd('rmdir /s/q %s' % device) # 清理历史文件 self.cmd('mkdir %s' % device) print(battery) with open('./%s/battery.txt' % device, 'w') as f: f.write(model + '\r' + battery) sleep(2) self.adb('pull /sdcard/battery.png ./%s' % device) if __name__ == '__main__': adb = Adbui() adb.test()
浙公网安备 33010602011771号