App遍历探讨(含源代码)
好像好久没有更新博客了,之前写的几篇博客关于自动化的框架的居多,其中好多博友向我提了好多问题,我没有回复。这里给博友道个歉~ ~ 总结几点原因如下:
1.我一般很少上博客,看到了都是好几天之前的问题
2.比较懒~ ~这是主要原因,以后会更改!
3.框架都是比较老了,现在已经对自动化单元测试框架,做了更高级的封装。(报告更加优美,功能也增加了:比如错误截图,后台异常搜集,可重复多次执行,错误录屏,后台crash和anr异常· 捕捉)
4.打算最近重新把这一套完整的东西,放在github上。
目前从事的是APP测试,所以封装了minicap快速截图、监听器处理异常弹框(广告)、图形识别、OCR技术等公共方法与appium完美结合,关于图形识别和OCR的作用是明显的...当前这一套东西同样适应用web端。
目前我们的所有测试结果是放在平台上的。包括功能、性能、稳定性、兼容性测试等....
这一块,我改天专门讲讲我在封装时的一些小心得.....
今天,我们的主题是遍历APP!!!
进入主题,为什么要研究这个玩意?
话说做app自动化测试或者功能测试对monkey这个玩意应该不陌生吗,在压力测试中经常跑这个然后搜集crash和anr信息。但是monkey的缺点是很明显:
1.没有目的性,遍历效果比较差,一般很难比较系统的遍历玩app的大部分页面!!
2.经常没事还把你wifi给断了,那么接下来的monkey是无意义的,有些app没有网就是废的~
3.可能陷入到一种死循环中,比如A-B-C-D-C-B-A 根本出不来,这时候如果看见了,可能狂按返回键帮他跳出整个死循环...
所以我也改造了monkey了 某种程度上让他看起来稍微智能和高效点,整个有感兴趣的博友可以留言讨论。。。
好了,说了这么多,我们总想着如果有一种算法大致上能像人一样点完app的上所有按钮,然后在点击过程中收集一些性能信息比如耗电、cpu、上下行流量...更重要的是搜集一些crash和anr信息,对于一些比较固定且内容变化不大的app还可以进行图形对比,判断不同版本对应不同页面的截图差异!等等
其实,早就有这个东西了像百度的测试的那个所谓的深度遍历,还有其他的各种云的遍历,但是但是,效率是相当的差,因为不支持定制和一些过滤规则,根本遍历不了几个按钮就结束或者陷入死循环...而且tm的还要钱...我是试用了下,懒得再用了!然后再testhome上看见了一个大神写的app遍历:https://testerhome.com/search?q=AppCrawler
感觉想法和思路很好!我非常佩服,但是我下载了下来用来遍历我们的这个比较比较变态的app,效率和遍历深度很差....这里没有其他的意思(针对我的这个app),实话实说!原因呢可能有一下几点:
1.我们的这个app广告特别的多,不时弹出个广告,让你措手不及,这个不好处理!
2.过滤规则我可能没太理解怎么用!
3.有死循环出现。比如在A用户的个人主页面点击进了B的个人profile然后进入C的个人profile,反正一直在profile页面遍历!
还有一些缺点:
1.没有脱离appium,运行脚本建立在appium的基础上
2.速度有点慢...
那么,我也想写个简单的遍历脚本(我希望他不断不简单),当前可能不能和这位大神的AppCrawler相比,但是也有我的一些小优点~~
1.用的自生长的深度优先遍历算法
在一个初始页面获取所有自定义规则的element,然后点击其中的一个element,跳转或者不跳转到另外一个page,再次获取次也么的合法element添加路径和图的邻边...一直这样递归一直到一个page
无法获取新的element或到达设定的深度或设定的时间终止遍历!!如果不太了解可以看下深度优先遍历算法。不过我们的这个图和邻边是单向的。
2.脱离了appium,利用appium的真正实现原理封装了针对于uiautomator2-server的方法,只要装有这个apk就行,省去了appium的安装成本和排除坑爹的appium错误的错误成本。
3.同样支持规则引导
4.目前自认为还可以的遍历效率和深度(对我这个app,当前还要不断增加逻辑和优化,这是我写这篇博客的主要目的!)
5.遍历完生成思维导图和遍历截图(用jsmind)
....
其他的慢慢的再加上,我只想让他遍历高效点和准确点,工程我已经放在github上,写这篇博客的目的就是想引入这么个概念,然后想让感兴趣的一些拓展或修改这个框架,不管是过滤规则还是算法
我相信只有大家共同来想好怎么做这个工程才能做好!!!
项目github的地址:https://github.com/zhoudaqiang/appCrawler
最后,写的时候比较随意主要是让他能运行起来。如果大家对这个框架不太了解或者对其中的任何思想不明白可以留言加QQ详聊。希望能有人一起想好做好这个遍历工程,至少能比monkey高效点~
App遍历探讨(含源代码)的更多相关文章
- C#用户自定义控件(含源代码)-透明文本框
using System; using System.Collections; using System.ComponentModel; using System.Drawing; using Sys ...
- 用C#来开发CAD插件,含源代码
转自原文 用C#来开发CAD插件,含源代码 CAD插件看起来很神秘,其实一个合格码农经过几天就能快速掌握.没什么秘密,开发CAD插件和winform一样简单学几个类库用法就是(只是太多人不喜欢知识分享 ...
- 2018-8-9-win10-uwp-装机必备应用-含源代码
title author date CreateTime categories win10 uwp 装机必备应用 含源代码 lindexi 2018-8-9 9:7:31 +0800 2018-8-9 ...
- 利用层序遍历(含空节点)和中序遍历重建二叉树 python
给定一颗二叉树的层序遍历(不含None的形式)和中序遍历序列,利用两个序列完成对二叉树的重建. 还是通过一个例子来说明整个过程,下图所示的二叉树,层序遍历结果为[a,b,c,d,e],中序遍历结果为[ ...
- 数据结构系列之2-3-4树的插入、查找、删除和遍历完整版源代码实现与分析(dart语言实现)
本文属于原创,转载请注明来源. 在上一篇博文中,详细介绍了2-3树的操作(具体地址:https://www.cnblogs.com/outerspace/p/10861488.html),那么对于更多 ...
- arcgis api for js入门开发系列八聚合效果(含源代码)
上一篇实现了demo的图层控制模块,本篇新增聚合效果,截图如下(源代码见文章底部): 聚合效果实现的思路如下: 1.map.html引用聚合包,项目已经包含进来了的聚合文件夹: <script ...
- arcgis api for js入门开发系列七图层控制(含源代码)
上一篇实现了demo的地图分屏对比模块,本篇新增图层控制模块,截图如下(源代码见文章底部): 图层控制模块实现的思路如下: 1.在地图配置文件map.config.js里面配置图层目录树节点信息,作为 ...
- arcgis api for js入门开发系列六地图分屏对比(含源代码)
上一篇实现了demo的地图标绘模块,本篇新增地图地图分屏对比模块,截图如下(源代码见文章底部): 对效果图的简单介绍一下,在demo只采用了两分屏对比,感兴趣的话,可以在两分屏的基础上拓展,修改css ...
- arcgis api for js入门开发系列五地图态势标绘(含源代码)
上一篇实现了demo的地图查询功能,本篇新增地图态势标绘模块,截图如下: 本篇核心的在于调用API的Draw工具:https://developers.arcgis.com/javascript/3/ ...
随机推荐
- Java递归读取文件路径下所有文件名称并保存为Txt文档
本文用递归的方法实现读取一个路径下面的所有文件并将文件名称保存到Txt文件中,亲测可用. 递归读取文件路径下的所有文件: /** * 递归读取文件路径下的所有文件 * * @param path * ...
- Docker多主机管理(八)--技术流ken
docker多主机管理 前面我们的实验环境中只有一个 docker host,所有的容器都是运行在这一个 host 上的.但在真正的环境中会有多个 host,容器在这些 host 中启动.运行.停止和 ...
- (摘)sql-索引的作用(超详细)
(一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonc ...
- 【CentOS7】服务环境搭建
用了两天时间,完成了服务环境的搭建.记录下了搭建的过程,搭建细节并没有记录. 1.OpenSSH. (1)yum search ssh (2)yum install openssh-server (3 ...
- paas saas iaas 区别
最近在公司里面经常听到一些paas saas iaas云服务的名词,把我自己都听蒙圈啦,所以就各种找资料终于对这三个名词有了一定的了解 首先上一张图如下: IAAS(nfrastructure as ...
- java-同步控制及不可变设置(只读访问)
1.还是直接上代码简单了解一下: package com.synchronize.test; import java.util.ArrayList; import java.util.Collecti ...
- vue2.x 给一个对象里添加一个没有的属性
obj = {...obj, name:'addName'} //给obj对象 添加一个name字段,并且赋值为‘addName’ 参考:
- pd_ds中的hash
前言 在c++的STL中,提供了一种hash函数,其用法和map是几乎一样的,但是速度却能快接近一倍 使用方法 需要的头文件 #include<ext/pb_ds/assoc_container ...
- python 的with用途(清理资源和异常处理,同时代码精简)
参考如下博客. https://www.cnblogs.com/DswCnblog/p/6126588.html #!/usr/bin/env python # with_example02.py c ...
- Android下获取FPS的几种方法
FPS(Frames Per Second)是关乎Android用户体验最为重要的指标之一,而在VR中更是如此.为了评估VR系统.VR SDK及Unity应用的性能,通常会实时获取FPS并将其显示出来 ...