简介 AppCrawler一个基于自动遍历的App爬虫工具。最大的特点是灵活性,可通过配置来设定遍历的规则。 谷歌的自动遍历的工具GoogleAppCrawler,设计的思想也一致。 优点和缺点 优点AppCrawler是基于Appium开发的,所以支持Android、iOS,支持真机和模拟器对遍历的页面、控件、事件、深度等都可自由控制,可通过配置来设定遍历的规则可通过配置来设定遍历的规则(比如设置黑名单和白名单,提高遍历的覆盖率)可定制:可自定义操作,如输入,滑动等其本身的遍历深度覆盖较全,比如它拥有APP的dom树,根据每个activity下的可点击元素逐个点击,比monkey更具有规律性,覆盖更全面生成的报告附带截图,可以精确看到点击了哪个元素及结果,对crash类的问题定位清晰 缺点只能定位一页,对于翻页的无法进行下滑再点击,导致下面的内容无法遍历(需要自己设置下滑然后翻页)对于调用第三方应用的不太稳定,比如每次到上传头像处就停止遍历对于整个layout区域是可点击,但是其中某个元素是不可点击的,没有进行遍历点击,比如:左上角的设置和右上角的私信都不能遍历到对于H5页面无法进行精确的定位点击,比如它的整个布局layout是一个大模块,不能进行点击运行速度较慢:AppCrawler是基于appium开发具备了跨平台的优点,但是也因为这层封装造成了运行速度相对较慢使用门槛高:正因为使用灵活性的问题,也造成了使用门槛的提高,主要基于yaml文件中使用appium的相关技术知识进行配置,这就对使用者有了一定的技术要求 安装和启动Crawler 1、安装最新版的AndroidSDK,保证它包含最新的buildtools和platformtools 2、java11(18不行) 3、下载AppCrawler,解压appcrawler。zip包,进入到解压目录 4、替换crawllauncher。jar为最新版本,记得把名称改成:crawllauncher。jar。(2023。1。28查看的最新版本是2。7。4) 5、安装和启动Appium 控制台输入:appiumsessionoverride,命令的意思是每次去执行的时候,不需要清理appium这个进程 6、启动Android模拟器,或者通过USB连接一台Android手机 通过ADB工具检测设备是否连接:adbdevices 7、启动Crawler执行后会自动遍历 启动命令:javajarcrawllauncher。jarcapabilityappPackagecom。xueqiu。android,appActivity。view。WelcomeActivityAlias如果是windows需要给capability参数加上修改对应文件的appPackage和appActivity信息,比如javajarcrawllauncher。jarcapabilityappPackagecom。addcn。newcar8891,appActivitycom。addcn。newcar8891。ui。activity。WelcomeActivity或者使用:javajarcrawllauncher。jaraapkpath(如果apk是无法识别包名和活动页面的,需要加上参数capability) 查看CrawlerOption的命令:javajarcrawllauncher。jar 8、退出 控制台输入ctrlc,生成测试报告。 它会在当前目录下,生成日期名称的测试报告文件。可以使用o制定测试报告的生成路径。输入两次ctrlc是强行停止。 定制化配置 以AppCrawler的配置文件完成定制化的自动遍历,以下为介绍配置文件的用法和一些特殊场景的处理。 配置文件的用法 模版文件生成 运行命令:javajarcrawllauncher。jardemo,会在当前目录下生成一个demo。yml文件,这进行定制化的配置文件模板。 添加插件 测试报告参数 loglevel日志等级 saveScreen是否截图,一个截图时间2s reportTitle报告名称 capability参数 与appium完全一致 可以配置apk、appPackage、appActivity 控制台的命令,是可以覆盖配置文件的capability参数的 dontStopAppOnReset参数 dontStopAppOnReset:true 这个参数允许我们在某个页面继续执行遍历,比如我们希望App先进入到某个页面后再进行遍历,或者当一个session结束后继续下一个session的时候我们希望不要杀死App重新执行,而是继续上一次结束的页面开始执行 ignoreUnimportantViews参数 这个参数设置为true的时候可以忽略不重要的view,加速pageSource的加载,加快测试速度 testcase测试用例 用于启动APP后的基础测试用例 完整形态 given:先决条件,只有条件成立的时候才完成后面的操作 when:对什么事件做什么事情 then:断言集合,事件结束后对结果断言testcase:name:TesterHomeAppCrawlersteps:when:xpath:action:driver。swipe(0。5,0。8,0。5,0。2)when:xpath:action:driver。swipe(0。5,0。2,0。5,0。8)then:〔contains(text,登录)〕 简写形态 直接使用xpath对应when里面的xpath 直接使用action对应when里面的actionxpath:元素定位路径action:clickthen:〔contains(text,登录)〕 action的动作支持 :只是截图记录 back:后退(android有back,ios的back需要给返回按钮的元素定位才可以使用) backApp:回退到当前的App,默认等价于back行为可定制 monkey:随机事件 xxx()执行代码: Thread。sleep(1000) driver。swipe(0。9,0。8,0。9,0。5) click:点击事件 longTap:长按 除以上所有行为外均视为输入行为 定位模式除了可以使用xpath之外还可以使用正则和包含关系 正则 使用开头的就认定为正则,确定,。输入密码 包含 可以使用元素其中包含的内容进行定位;密码,输入 selectedList:制定遍历控件 定义了哪些控件要被遍历到 这里如果想设置让其点击所有可点击的TextView和ImageView控件,修改完成如下:selectedList:xpath:android。widget。ImageView〔clickabletrue〕xpath:〔clickabletrueandcontains(class,Text)〕 firstList::优先遍历 哪些控件被优先遍历 lastList:最后遍历 哪些控件被最后遍历 backBatton:返回按钮 返回的时候点击哪个按钮(ios需要) blackList:黑名单 用在不想让它变里的元素上 比如:相机、忘记密码、支付等 tagLimitMax:全局设置 同类型的最多点击的次数;这里设置为2次 tagLimit:自定义控件类型的点击次数 这里设置对于ListView类型的只点击一次 maxDepth:遍历的最大深度 triggerActions:触发器,特定条件触发执行动作的设置(触发规则)广告、升级弹框在测试过程中突然出现某些动作需要输入某些动作需要特定次数的操作这样每次出现弹框都会被处理测试中途碰到了账号密码输入框需要输入的可以提前在triggerActions中设置times:需要点击几次,不写,表示出现了这个元素就会被点掉(比如应用在:稍后再看、关闭、取消等按钮)点击弹窗的关闭按钮triggerActions:xpath:〔contains(resourceid,cancel)〕action:clicktimes:1 登录案例triggerActions:action:clickxpath:〔resourceidcom。xxx。test:idlogin〕times:1action:0940xxxxxxxxxpath:〔resourceidcom。xxx。test:idphoneedit〕times:1action:123456xpath:〔resourceidcom。xxx。test:idpwdedit〕times:1action:clickxpath:〔resourceidcom。xxx。test:idbtnsubmit〕times:1 执行定制化的配置文件 命令:javajarcrawllauncher。jaraapkpathcappdemo。yaml 测试结果如果没有使用o参数指定log输出的路径,appcrawler就会在当前目录下生成以时间为命名的文件夹,里面保存了所有的数据,文件、截图、log。打开文件夹会发现如下,每一步都会进行截图(这也是速度变慢的原因之一吧)以及对于的dom文件,这里会看到有几个steps文件,这个只是随意点了某个操作来告知用户正在操作,真正的执行步骤是从这之后开始。在测试log中有一个index。html文件,打开它会看到刚才运行的测试报告,appcrawler会把每一次点击当做一个测试用例,没一个页面当做是一个测试套件;将界面和界面内的控件点击模拟成了测试套件和测试用例的关系。成功的用Succeed表示,Canceled是遍历的时候发现有这个可点击的控件,但是最后却没遍历到的控件。在生成的文件夹中有appcrawler。log,里面记录了详细的执行步骤的log信息(加上vv参数运行的话会得到更多更多的log信息)。index等于几就表示第几次事件,action表示当前的操作,xpath就表示当前操作的元素的xpath表达式appcrawler的一个基本认识,既然提到了它的定制化的特点,就需要通过配置文件来完成了。 框架组成 底层有个叫AccessibleServices东西,它可以获取Android所有界面的控件。uiautomator获取元素进行操作的时候,就是靠AccessibleServices去获取控件,然后去触发一定的行为,uiautomator就是将其进行了包装。基于uiautomator,appium开发了一个uiautomatorserver,appium走的是HTTP协议ATX开发了一个uiautomator2,maxim就处于这一层,ATX走的是JSONRPC协议 appcrawler处于最上层,所以appcrawler由于多了两层封装,再加上运行过程中加入了截图(可以在配置中取消,但是取消后不利于结果的查看),运行起来自然就慢了。 遍历原则 它的遍历原则是,找页面的里层次最深的元素,也就是处于中心位置元素会被优先遍历 常见问题 1、问题:运行后提示OptionUnknown 解决:建议换成最新的crawllauncher,使用正确的Option,查看命令:javajarcrawllauncher。jarpath。 2、问题:运行命令后提示找不到设备,但是adbdevices可以查询到设备。 解决:数据线重新连接手机,再次允许手机权限即可解决。 3、问题:提示crawler运行成功,但是Found0crashes。 解决:使用最新版本的crawllauncher。jar,option换成a或者capability等方式启动即可解决。 4、问题:手机已经存在最新版本的APP,运行命令使用了a安装旧APP版本,提示降级error。 解决:删除手机最新版本的APP,或者安装更新版本的APP,或者使用其他的option启动crawler。 5、问题:启动命令执行后提示:〔W3C〕error:Activityname。ApiDemosusedtostarttheappdoesntexistorcannotbelaunched!Makesureitexistsandisalaunchableactivity 解决:需要修改遍历文件中的包名即可。 6、问题:app运行比较慢,容易超时怎么办? 解决:AppCrawler默认每次操作时会等待500ms;通过triggeraction来解决需要等待的条件,xpath为进度条,action为sleep1s,截图操作是可关闭的。 7、问题:tagLimit会限制同属性但不同层级的元素吗? 解决:tagLimit限制的是相同的父节点层级,不管属性,是看布局的层级 8、问题:如何防止遍历的时候不小心跳到别的应用?跳到别的应用后怎么回来? 答:会自动跳转回来的。除非设置了App的白名单 9、问题:页面需要在当前页不停滑动加载测试 答:遍历完当前页后用afterpage参数设置滑动 10、问题:appclawermaxDepth:这个层级是如何定义的? 答:maxDepth可以从log中看到,AppCrawler。log中有一个Stack的输出,里面默认保存的是所有activity的栈记录。 11、问题:Couldnotdeterminewhetherclass‘org。pegdown。Parserparboiled’hasalreadybeenloaded 解决:java版本换成11,有些api可能被禁用了