今天说说当今主流的自动化 UI 测试框架之一的 appium 使用总结,其中卡的我比较久的是被测 App 的安装时手机弹出的权限弹窗问题,主要说下解决方案。
之前也接触过网易的 airtest project,uiautomator2 等自动化测试框架, appium 相对要麻烦一些,需要很多手机设备信息,包括被测 App 的信息。
appium 主要的问题就在于它的设计就是建立在手机已经安装好了被测 App 的,它初始化连接设备需要打开指定 App,而手动去安装被测 App 时很 low 的方式,一般来说我们会想到用 脚本去点击 “同意弹窗”,但 appium 没初始化完成时是无法使用 click 方法的。文章源自玩技e族-https://www.playezu.com/492940.html
看过网上一些解决方案,说说我的实践效果:
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,再使用多线程去点击掉询问弹窗。代码如下:文章源自玩技e族-https://www.playezu.com/492940.html
# 配置 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)文章源自玩技e族-https://www.playezu.com/492940.html
好,到此结束。喜欢的点个赞吗,谢谢大家。文章源自玩技e族-https://www.playezu.com/492940.html
未知地区 40F
ios 需要授信应用,怎么解决
未知地区 39F
appium driver 的安装弹框元素查找比较慢,我实测发现经常还没查到弹框按钮,安装就等待超时了。
未知地区 38F
楼主,用你的方法尝试了下,确实很好,但是有一点,有的手机偶尔执行安装的时候,那个安装弹窗一直不出来,然后另一个线程就开始不停的查找安装权限弹窗了,怎么安装弹窗出不来安装不上是为什么呢
未知地区 37F
正解,看我专栏https://zhuanlan.zhihu.com/custom-appium
未知地区 36F
楼主你好,我用你的方法也是无法定位,最终的结果是安装超时报错。在 appium server 那里查看信息输出,发现定位回来的结果是空的。
未知地区 35F
哈哈,我就打算这么处理
未知地区 34F
desired_caps2 = {“deviceName”:”860BCMN22FF2″,
“app”: app,
“noReset”: True,
“appWaitPackage”: “c.l.a”,
“appWaitActivity”:”com.example.TestPlugin.MyActivity”,
“appWaitDuration”: 60000,
“newCommandTimeout”: 200,
“platformVersion”: “7.0”,
“autoGrantPermissions”: True,
“platformName”: “Android”,
“automationName”: “UiAutomator2”
}
sleep(3)
if __name__ == “__main__”:
# 调用始终允许函数
print(‘begin main’)
# performance_service = PermissionServer(desired_caps[‘deviceName’], False)
# performance_service.start()
driver = webdriver.Remote(‘http://localhost:4723/wd/hub’, desired_caps)
time.sleep(1)
# performance_service.setPause(1)
遇见几个问题:已经 block 了
为什么后安装上的 app, 启动后不长时间就自己杀死进程呢??
发现安装上的 app 和原来的 app 签名文件不一样?
如何解决这个 2 个问题呢???
app 升级到 28 后,必须怎么解决的???
未知地区 33F
请问是安装 apk 和安装确认一起进行是吗?
未知地区 32F
这个怎么在 robotframework 实现呢?
未知地区 31F
整个 service 去弄这些事情也是不错的