Appium启动Android App综合实践
测试环境
- Win 10 64bit
- Python 3.5
- Appium 1.7.2
- Andriod 5.1.1 模拟器& Android 5.1 MX4
- 测试App:考研帮Android版 3.1.0
App启动
自动安装考研帮App(kaoyan3.1.0.apk),然后启动App
测试步骤
- 获取待测试app的packageName和Activity
- 配置Capability
- 连接设备
- 编辑脚本并运行
- 查看结果
运行前检查事项
- 检查设备是否连接
- 检查Appium server是否启动
- 检查Capability配置信息是否正确
测试脚本
1 | from appium import webdriver |
Tips:
1.首次启动Appium会在设备上安装2个守护app,Appium Settings和Unlock 部分设备系统由于权限的问题(如:三星S6 edge+)需要用户手动确认安装,否则不安装守护App会导致脚本运行失败,安装好后不要随意卸载这两个App。
- Unlock :用于解锁手机弹窗提示
- Appium Setting:Appium守护app
2.from appium import webdriver
中的webdriber模块和selenium中的webdriver模块不一样!
webdriver模块源码路径:
1 | {python安装路径}}\Lib\site-packages\appium\webdriver |
截图
在实际自动化项目运行过程中,很多时候App可以会出现各种异常,为了更好的定位问题,除了捕捉日志我们还需要对运行时的设备状态来进行截屏。从而达到一种“有图有真相”的效果。
save_screenshot()
该方法直接保存当前屏幕截图到当前脚本所在文件位置。
1 | driver.save_screenshot('login.png') |
get_screenshot_as_file()
get_screenshot_as_file(self, filename)
将截图保留到指定文件路径
1 | driver.get_screenshot_as_file('./images/login.png') |
实践案例
测试场景
在考研帮App登录页面输入用户名和密码之后截图,分别保存到当前文件和指定的文件路径。
代码实现
1 | from find_element.capability import driver |
元素等待
在自动化过程中,元素出现受网络环境,设备性能等多种因素影响。因此元素加载的时间可能不一致,从而会导致元素无法定位超时报错,但是实际上元素是正常加载了的,只是出现时间晚一点而已。那么如何解决这个问题呢?
设置元素等待可以更加灵活的制定等待定位元素的时间,从而增强脚本的健壮性,提高执行效率。
强制等待
设置固定的等待时间,使用sleep()
方法即可实现
1 | from time import sleep |
隐式等待
隐式等待是针对全部元素设置的等待时间
1 | driver.implicitly_wait(20) |
显式等待
显式等待是针对某个元素来设置的等待时间。
方法WebDriverWait
格式参数如下:
1 | from selenium.webdriver.support.ui import WebDriverWait |
WebDriverWait()
一般和until()
或until_not()
方法配合使用,另外,lambda
提供了一个运行时动态创建函数的方法。
1 | from selenium.webdriver.support.ui import WebDriverWait |
实战案例
- 测试场景:考研帮登录之后显示等待【论坛】按钮,然后点击。
代码实现
1 | from find_element.kyb_login import driver |
键盘操作相关
在我们正常使用设备中,经常会进行键盘相关操作,如:拨号,返回、音量键等。在Appium中同样也可以模拟相关键盘操作。
按键方法
1 | KEYCODE_CALL 拨号键 5 |
使用方法
1 | driver.press_keycode(4) #发送keycode,功能:按键 |
踩坑相关
Appium服务未启动
1 | urllib.error.URLError: <urlopen error [WinError 10061] 由于目标计算机积极拒绝,无法连接。 |
【解决方案】点击启动Appium按钮后,出现[Appium] Welcome to Appium v1.7.2提示后再运行脚本
会话冲突
1 | error: Failed to start an Appium session, err was: Error: Requested a new session but one was in progress |
【报错分析】
之前的会话没有关闭,然后你又运行了测试实例,也没有设置覆盖.
【解决方案】
重新停止appium服务,开启Appium服务
在AdVance界面勾选Allow Session Override选项 ,重启Appium
测试结束在AfterClass加driver.quit()
未安装java环境
1 | selenium.common.exceptions.WebDriverException: Message: A new session could not be created. (Original error: 'java -version' failed. Error: Command failed: C:\WINDOWS\system32\cmd.exe /s /c "java -version" |
设备未连接
1 | selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Could not find a connected Android device. |
【解决方案】由于设备未连接,或者连接后未开启USB Debug。需要重新连接设备即可。
Tips:
更换手机设备后如下对应的属性要记得更新,否则无法正常运行脚本。
1 | desired_caps['platformVersion'] = 'XXX' |
launchable activity 值错误
1 | Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity |
【解决方案】
- launchable activity 写错更正即可。
- 如果是存在此activity,则一定是AndroidMainfest.xml.xml中,当前activity设置的属性exported=false,表示当前activity无法被外部程序唤醒。(appium无法唤醒此类)需要研发人员去修改参数。
系统权限问题
1 | Failure [INSTALL_FAILED_USER_RESTRICTED]) |
【解决方案】
- USB安装管理权限限制,关闭即可。
- 开启安装允许未知来源app选项
服务异常
1 | An unknown server-side error occurred while processing the command” while opening the App |
【解决方案】重新启动Appium服务
Oppo设备系统 noReset配置
1 | selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'E\:\\Andriod_sdk\\platform-tools\\adb.exe -P 5037 -s 8de1cad4 shell pm clear com.mgtv.data.sdk' exited with code 1'; Stderr: 'Error: java.lang.SecurityException: PID 31008 does not have permission android.permission.CLEAR_APP_USER_DATA to clear data of package com.mgtv.data.sdk'; Code: '1' |
解决方案:
- 将
noRest
值设置为True
OPPO 8.X 设备unicodeKeyboard不兼容问题
1 | selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'E\:\\Andriod_sdk\\platform-tools\\adb.exe -P 5037 -s 8de1cad4 shell ime enable io.appium.settings/.UnicodeIME' exited with code 4294967177'; Stderr: ''; Code: '4294967177' |
解决方案:将unicodeKeyboard
参数配置注释掉。oppo系统不兼容,由于appium无法获得UPDATE_APP_OPS_STATS
权限,appium原始日志如下:
1 | [AndroidDriver] Unable to set mock location for app 'io.appium.settings': Error executing adbExec. Original error: 'Command 'E\:\\Andriod_sdk\\platform-tools\\adb.exe -P 5037 -s 8de1cad4 shell appops set io.appium.settings android\:mock_location allow' exited with code 4294967295'; Stderr: 'Security exception: uid 2000 does not have android.permission.UPDATE_APP_OPS_STATS. |
WRITE_SECURE_SETTINGS
权限限制
部分设备启动时由于系统权限控制会出现WRITE_SECURE_SETTINGS
报错,如下所示:
1 | An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'E:\\Andriod_sdk\\platform-tools\\adb.exe -P 5037 -s FMTGUKRGVKR86PTS shell 'settings delete global hidden_api_policy_pre_p_apps;settings delete global hidden_api_policy_p_apps;settings delete global hidden_api_policy'' exited with code 255'; Stderr: 'Security exception: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS |
解决办法:
- 小米:在开发者选项里,把“USB调试(安全设置)”打开即可。 允许USB调试修改权限或模拟点击
- oppo:在开发者选项里,把”禁止权限监控”打开即可。