今天说说当今主流的自动化 UI 测试框架之一的 appium 使用总结,其中卡的我比较久的是被测 App 的安装时手机弹出的权限弹窗问题,主要说下解决方案。
之前也接触过网易的 airtest project,uiautomator2 等自动化测试框架, appium 相对要麻烦一些,需要很多手机设备信息,包括被测 App 的信息。
appium 主要的问题就在于它的设计就是建立在手机已经安装好了被测 App 的,它初始化连接设备需要打开指定 App,而手动去安装被测 App 时很 low 的方式,一般来说我们会想到用 脚本去点击 “同意弹窗”,但 appium 没初始化完成时是无法使用 click 方法的。
看过网上一些解决方案,说说我的实践效果:
1,采用 adb 点击弹窗 “同意” 坐标方式。
效果不佳,而且手机众多,很多手机的询问弹窗位置不一样,不建议使用。
2,通过 adb 先把被测 apk 文件 push 到手机指定文件夹,再用 db shell pm install 安装。
网上说能解决部分手机(不出现询问弹窗),但我使用的小米,华为等依然有弹窗。可能是手机原因不用吧。 多与做设备集群的自动化测试的来说,这种依然不行。
3,首次安装人工点击,测试完成后不卸载,后续 App 版本用自动化脚本测试时采取覆盖安装。
覆盖安装不会出现询问弹窗(我测的小米是这样),这种方式就只 low 一次,后续还好吧。,
4,采用其他框架如 uiautomator2 的脚本,在 appium 是初始化安装 App 时,点击掉询问弹窗。
可行,但入手门槛高。
5,下面介绍我使用的这种方案,如下:
因为 appium 需要先打开一个 App 才能完成初始化,所以我们可以在配置参数中不配置我们被测的 App,可以配置一些很小的 App 信息,且必须是每部手机上都会安装的。刚好,使用 appium 在设备与服务端通信,会在设备上安装一款叫 appium setting 的很小的 App。
因此,我们可以参数里配置它,完成初始化后,再用 adb 或者 appium 提供的安装函数去安装实际被测 App,再使用多线程去点击掉询问弹窗。代码如下:
# 配置 appium srtting 为被测 App
desired_caps = {}
desired_caps['platformName']='Android'
desired_caps['deviceName']='huawei-stf_al00-8BN0217930000453'
desired_caps['paltformVersion']='8.0.0'
desired_caps['appPackage']='io.appium.settings'
desired_caps['appActivity']='io.appium.settings.Settings'
desired_caps['autoGrantPermissions']= True
drive = webdriver.Remote('http://localhost:4723/wd/hub,desired_caps')
# 再安装真实被测 App,利用线程点击掉询问弹窗
thread1 = usb_install_thread() # 这是点击弹窗的线程
thread1.start()
drive.install_app(hGoName)
好,到此结束。喜欢的点个赞吗,谢谢大家。


未知地区 30F
呃呃 这个问题我还没遇到过呢 我这边多次调用 adb 命令没问题的 你检查下你的版本这些 用最新的试试吧 我没遇到过这个问题哦
未知地区 29F
解决了一个顽疾啊,有时间自己试试。
还有一个问题,想问下,用 python 的 os 安装包的时候,adb 每执行一次,感觉下次执行还是需要初始化,之前用 airtest 的时候,多次调用单个的 adb 命令会出问题
比如说我清除包的数据(模拟了次卸包重装),做了一件事,之后再掉接口去安装一个渠道包,这个时候它就超时了,看后台一堆 5037 的进程,
想问问有什么办法能像在命令台一样,只要连接没断开,下次可以直接执行 adb 命令呢
未知地区 28F
这个你可以一直监控到你进入 App,根据情况来使用吧,安装这块的线程你就可以当进入 App 后就关闭掉
未知地区 27F
这个原理我知道,我只是想了解一下你那边是如何判断脚本不需要点击了的,这个很关键
未知地区 26F
if flag == False:
break 这是个开关,在脚本开头 你要先写句 flag = Ture , 这时线程会循环判断 有没有方法里写的那几个弹窗, 当你觉得脚本某阶段不需要线程点击了(安装完成),你就写句 flag = False 线程循环检测到 flag = False 时 ,就停止了
未知地区 25F
我这个线程不是只为了点一部手机,是为了点掉多不手机的弹窗,而多部手机的弹窗文字都不一样,所以做了判断,判断有就点,没有就下一个判断,异常处理是有时候没点到不至于脚本报错(有的手机会有弹窗时间,10 秒内不点就消失,有时候会错过)。
未知地区 24F
if flag == False:
break
这个 flag 标志位是依据什么设置的呢,大佬
未知地区 23F
用 UI2 开启多线程前几次还可以 click 到按钮,后边就 click 不到了哇,线程学你的做了判断和异常处理的
未知地区 22F
我是说 appnium 安装找不到你哪个包
未知地区 21F
你用 adb 安装怎么会找不到呢?adb 安装好像有 3 种还是 4 种方式呢,你可以直接从电脑里安装到手机啊
os.system(“adb install -r ” + hGoName) gGoName 是 apk 文件在电脑的地址,这只是一种方式哈,当然,很多手机会有弹窗的