针对Android App 的UI遍历自动化方案
- Limit :限定遍历时长,不包括初始化应用 & 结果统计,超过规定时长后结束
- Normal :不规定遍历时长,全部递归执行完成后结束
- Normal : 按序遍历,多次/多设备执行的路径完全相同
- Random : 随机遍历,可设置覆盖程度(0 <CoverageLever <=1),在当前页面中随机抽取 覆盖百分比个 控件进行遍历
- Activity : 遍历App的所有Activity(可无参数唤起的)
- AUICrawler
- config
- Setting.py
- config
SaveScreen : 遍历过程中截图功能开关,包括还原控件显示过程截图
SaveJumpOutScreen : 跳出遍历时截图功能开关,包括 跳出App & 进入不可遍历页面
KeepRun : 被测 App Crash/ANR 后是否继续拉起App&继续遍历
TimeModel : 时间模式 Limit/ Normal
LimitTime : 限时模式下,遍历时长,单位 秒
CrawlModel : 遍历模式 Random / Normal / Activity
CoverageLevel : 覆盖程度 0< c <=1
UnInstallApk : 是否在执行前卸载 测试App/被测App
InstallApk : 是否在执行前安装 测试App/被测App
ApkPath : 被测App 安装包路径
TestApkPath : 测试App 安装包路径 (若无测试App, 可设为空,或其他会被使用的App路径)
AppMainActivity : 被测App的主页面Activity
FirstClickViews : 有些浮层页面下方的控件也会获取到,会被无效遍历,建议提前将浮层的关闭/缩小按钮的id放入此列表,每次获取页面时,会优先点击此列表中的控件,保证遍历更有效
BackBtnViews : 返回按钮列表,在进入一个新页面时,不会优先遍历返回按钮,会在此页面所有可遍历控件遍历结束后,点击返回按钮返回,这样会提升遍历效率
UnCrawlViews : 如果在遍历过程中,发现因操作一个控件导致遍历出错或降低效率,可以将此控件的id/text放入此字典,不再操作此控件,以保证遍历效率
AuthorizationAlert : 不同App在不同品牌/不同系统的设备上使用时,会弹出系统弹窗,可前将系统弹窗允许按钮的信息存入此列表,当显示弹窗时优先处理弹窗
RunInitNodes : 若进入主页面前也会有一些可遍历的页面/控件,设置是否遍历,若关闭此开关,则需要其他方式初始化App,保证启动时直接进入主页面
RunInitCase : Robotium Case 执行开关, 关闭后在遍历前,不会执行Robotium Case
InitCases : Robotium Case 列表, 按序执行,可以将遍历前提条件的初始化Case存入其中
TestRunner : Robotium Case 执行依赖的TestRunner
Login : 执行中登录功能开关,在遍历过程中,进入到登录Activity时会登录,若想只遍历登录状态,请在初始化时执行登录Robotium Case
AppLoginActivity : 登录页面Activity, 目前只支持被测App本身的登录方式,暂不支持第三方登录
LoginViewList :登录按钮信息,[账号输入框AccountViewID, 密码输入框PasswordViewID, 登录按钮LoginBtnId]
AccountList : 账号密码列表,执行前请保证账号足够设备1对1分配,可多不可少
SMTP_HOST : SMTP服务器地址
Result_Mail_To_List : 测试报告邮件发送给哪些人
Failed_Mail_To_List : 测试过程中被测应用出现异常,邮件通知哪些人
Mail_User : 使用哪个邮箱账号发送测试报告
Mail_Pass : 使用的邮箱账号的登录密码
- AUICrawler
- Crawler.py
-d xxxx : 指定单设备/ 多设备列表 device1id,device2id,device3id...
-p x/x.apk,x/xtest.apk : 指定被测应用的Apk & 被测Apk的测试Apk。 可以只传入 xxx/xxx.apk作为被测apk,不传入",xxx/xxxtest.apk"
-t 30 : 开启限时模式 & 调整遍历限时时间 ,单位分钟
-r 0.8 : 开启随机遍历 & 设置覆盖程度
-a : Activity遍历模式
-u : 卸载&安装
-i : 执行初始化 & 遍历主页面前的页面
-c : 执行初始化Robotium Case
-s : 只保存有效遍历操作截图
-j : 保存还原控件显示 & 跳出App等非有效遍历截图
-k : keepRun (Crash/ANR 后继续执行)
-l : 遍历过程中登录
- 指定apk快速遍历
python Crawler.py -up xxx/xxx/xxx.apk
- 指定单个设备、重新安装App、初始化App、执行Robotium Case、按序遍历10分钟 、不保存截图
python Crawler.py -d deviceid -t 10 -uic
- 指定多个设备,不重新安装App、不初始化、覆盖程度0.5随机遍历5分钟、保存有效遍历截图、Crash后重启继续执行、遍历过程中登录
python Crawler.py -d deviceid1,deviceid2,deviceid3 -t 5 -r 0.5 -skl
- 使用当前连接的所有设备、重新安装App、初始化App、不执行Robotium Case、遍历所有无参数Activity、不限时、保存所有截图
python Crawler.py -uisj
- 自由组合参数执行,默认执行模式:所有设备、不重新安装、不初始化、按序执行所有控件、不截图、Crash/ANR就停止、过程中不登录
- 可以修改Setting调整默认的执行模式
1. 支持多设备同时执行(多线程执行,每个设备单个线程)
2. 初始化App(针对首次启动有需滑动的Guide页的App,优先向左滑动到有可点击的控件显示;会遍历进入主页面前显示的控件至进入Setting中设置的主页面)
3. 支持执行Robotium Case(主要是用来再初始化App至满足想要的遍历条件,比如遍历前先登录 / 解决一些可能会影响遍历的操作)
4. 启动主页面按所选模式开始遍历
1. 反复进入一个页面,但操作的控件并不同:可能是操作后页面变化,导致下一个需要操作的控件没有正确显示,需要返回再还原其显示
2. 长时间未操作:出现此问题时请查看设备详细Log,从上一次正常操作后查看Log, 可能是操作后,页面变化较大,不能找到后续的很多控件的还原路径
3. 在类似个人资料页这种相似度极高的页面进入的越来越深:页面相似度太高,个人中心-好友列表-好友个人中心-好友的好友列表...这种无止境的深层次遍历会影响获取还原&返回路径,可能会影响遍历效率&结果,所以当发现这种现象时,可以将入口设置在setting.py中不再操作此入口。
1.截图时长为2秒左右,稍长,若为提高执行速度,可以在Setting中关闭所有截图
2.每张截图大小为100-350 KB,可以在Setting中设置SaveJumpOutScreen=False,减少截图数量,缩小所占空间
3.有效遍历截图,会在操作前将控件区域高亮显示
- AUICrawler
- module
PlanInfo : 本次执行的相关配置 & 运行状态等信息
CrawledApp : 当次执行时使用的App本身信息 & 遍历中相关状态&信息
DeviceInfo : 每个执行的Device的本身信息 & 遍历中相关状态&信息
PageInfo : 每次获取时的页面信息 & 遍历中相关状态&信息
NodeInfo : 每个控件的获取时信息 & 遍历中相关状态&信息
- AUICrawler
- result
- 2017xxxxxxxxxx : 目录名称时间执行的测试计划
- CrawlerLog.txt : 计划执行时主要Log
- Result.html : 测试报告
- 设备ID
- CrawlerLog.txt : 此设备执行时详细Log
- Screenshot : 截图存储目录
- Uidump.xml : 运行中获取页面信息生成的临时文件,计划执行结束时会删除
- 2017xxxxxxxxxx : 目录名称时间执行的测试计划
- result
- AUICrawler
- result
- 2017xxxxxxxxxx
- Result.html
- 2017xxxxxxxxxx
- result
执行Log : 打开当次计划执行Log
设备ID : 对应设备的存储目录
异常退出 : 对应设备的logcat
遍历结果 : 对应设备的遍历详细Log
在Setting.py中配置邮件信息
遍历结束后将报告发送给对应的接收人
不设置不会发送,不会报异常
不同的邮件客户端 / 浏览器,邮件显示会不同 html临时接触,所以在显示时可能会有些小问题, 如果有前辈可以帮助调整可以联系我,教教我,谢谢
- 1. 架构设计
- 2. 递归逻辑
- 3. 配置信息
- 4. 限时模式
- 5. 随机遍历模式 (请提前在Setting中设置 功能开关 & 覆盖程度)
- 6. Activity模式 (现只遍历无参数可启动的Activity,若执行Activity模式,请先初始化&安装开关是否需要开启)
- 7. 对Clickable的控件遍历 (点击,产生的新有效控件会被遍历)
- 8. 对LongClickable的控件遍历 (长按,产生的新有效控件会被遍历)
- 9. 对EditText的遍历 (随机输入字符,输入字符后的EditText不会再遍历,产生的其他新有效控件会被遍历)
- 10. 对Scrollable的控件的遍历 (降低优先级,暂时感觉列表的滚动的用处并不大,反而产生不必要的遍历,增加了遍历时长)
- 11. 执行结果收集&统计&展示
- 12. 遍历过程中,遍历到登录页面登录功能 (支持多设备登录,请在Setting中设置足够的账号信息)
- 13. 命令行参数执行
- 14. webView遍历 (现在只是对UI控件遍历,未遍历WebView内容,准备补充WebView遍历,若有知道有哪些模块可以获取WebView(除类似Appium这种框架),欢迎告知
- 15. 邮件发送测试报告
- 16. 优化截图重绘方案 (虽然没有更换方案前也差不多解决了内存疯涨的问题,但是自己写的新方法还是更省时间和内存一些)
- 17. Crash时及时发送携带logcat附件的邮件,及时反馈问题
- 18. 操作导致应用异常结束,再次还原此操作,查看是否再次异常结束 & 发送结果邮件。
- 19. 记录&统计执行过程中设备的 内存、CPU、耗电、FPS 等 性能变化, +到测试报告中
- 20. 执行前判断设备状态,如果已锁屏(屏幕未唤醒 & 屏幕唤醒但是锁定状态),则该设备不执行
- 21. 执行前初始化网络/蓝牙
- 22. 执行过程中,当发现被测应用不再运行时,启动被测应用后,会检查设备状态,如果已锁屏(屏幕未唤醒 & 屏幕唤醒但是锁定状态),则不再继续执行
- 23. 单独设置异常邮件收件人,与结果邮件收件人做区分
- 24. 如果安装被测应用失败,该设备不会执行遍历;
- 25. 如果未开启安装被测应用&被测应用并未安装,则使用Settings中设置的Apk路径尝试安装,如果安装被测应用失败,该设备不会执行遍历;
- 26. 遍历控件逻辑重构,不再按控件类别定义操作优先级,只根据控件树的结构,依据预操作控件类型匹配操作
- 27. 重新梳理参数化执行相关
- 28. 在遍历前增加清除被测App 数据和缓存
- 29. 调研 chromdriver 与Android 的webview 通讯 (同扩展熟悉ios-webkit-debug-proxy)
QQ:553410327 ,欢迎前辈指导,同学交流