Appium Toast元素识别
问题思考
在日常使用App过程中,经常会看到App界面有一些弹窗提示(如下图所示)这些提示元素出现后等待3秒左右就会自动消失,那么我们该如何获取这些元素文字内容呢?
Toast简介
Android中的Toast是一种简易的消息提示框。
当视图显示给用户,在应用程序中显示为浮动。和Dialog不一样的是,它永远不会获得焦点,无法被点击。
Toast类的思想就是尽可能不引人注意,同时还向用户显示信息,希望他们看到。而且Toast显示的时间有限,一般3秒左右就消失了。因此使用传统的元素定位工具,我们是无法定位到Toast元素的(传说中低调奢华有内涵)。
Appium Toast内容获取
Add ability to verify TOAST messages (these can’t be interacted with, only text retrieval allowed)
Appium 1.6.3开始支持识别Toast内容,主要是基于UiAutomator2,因此需要在Capablity配置如下参数:
1 | desired_caps['automationName']='uiautomator2' |
友情提示:
automationName
设置为uiautomator2
后可能会导致整个appium运行比较慢,如果非必要获取Toast不建议这样设置,直接使用默认的配置desired_caps['automationName']='Appium'
即可
安装appium-uiautomator2-driver: 安装命令如下:
1 | cnpm install appium-uiautomator2-driver |
安装成功后可以在 C:\Users\XXXX\node_modules看到对应的文件:
- _appium-uiautomator2-driver@1.12.0@appium-uiautomator2-driver
- _appium-uiautomator2-server@1.10.0@appium-uiautomator2-server
安装selenium模块
1 | pip install selenium |
安装完成后使用如下命令检测是否安装成功
1 | #查看selenium版本 |
测试环境
- jdk版本:”1.8.0_05”
- appium版本:1.7.2 (不能低于1.6.3)
- selenium:3.11.0
- 测试设备:Android 5.1.1
- Python:3.5
- 测试App:考研帮Android app V3.1.0
测试场景
进入登录界面输入错误的用户名或者密码,获取Toast内容:
- “用户名或密码错误,你还可以尝试4次”
- “验证失败次数过多,请15分钟后再试”
代码实现
get_toast.py
1 | # coding=utf-8 |
注意:Toast内容为中文时,顶部必须注释# coding=utf-8 否则会因为编解码导致文字识别失败。
报错相关
Appium和Uiautomator版本不兼容
1
2selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: helpers.installApkRemotely is not a function
修改建议:安装最新版本的Appium
Android SDK版本问题
1 | selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Could not sign with default certificate. |
修改建议:
- 更新安装sdk
- 管理员打开appium再执行
- 如果还不行把这个把jdk、安卓sdk移动到其他盘里试试
- appium服务连接超时
1 | Could not proxy command to remote server. Original error: Error: read ECONNRESET |
造成该问题的原因一般是appium服务断开了,查看appium运行的详细log我们可以看到
1 | [BaseDriver] Shutting down because we waited 60 seconds for a command |
默认是60秒,我们可以设置更大的等待时间间隙,如下所示即可
1 | desired_caps['newCommandTimeout']=2000 |