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()

 

posted on 2020-05-09 19:24  愚哥  阅读(1149)  评论(0)    收藏  举报

导航