appcrawler学习记录 - lslgithub151/ideas GitHub Wiki

AppCrawler入门

简介

  • appcrawler,使用Scala编程语言运行在JVM上,是自动遍历的app爬虫工具,其主导思想是尽可能多的去操作被测app的界面元素,每个元素至少操作一遍。
  • 支持android和iOS,支持真机和模拟器,最大的特点是灵活性,可通过配置来设定遍历的规则,用于自动化回归测试,实现对整个APP的所有可点击元素进行遍历点击1。

应用

  • 测试app 是否会产生Crash,是否会有ANR,页面错误等问题
  • 回归测试 日志可读、定向场景设计、测指定页面的稳定性、报告清晰展示遍历结果

优点

  • 支持android和iOS, 支持真机和模拟器
  • 可通过配置来设定遍历的规则(比如设置黑名单和白名单)
  • 其本身的遍历深度覆盖较全,比如它拥有APP的dom树,根据每个activity下的可点击元素逐个点击
  • 生成的报告附带截图,可以精确看到点击了哪个元素及结果,对crash类的问题定位清晰

不足

  • 大量使用xpath,速度慢
  • 只能定位一页,对于翻页的无法进行下滑再点击,导致下面的内容无法遍历
  • 对于调用第三方应用的不太稳定,比如每次到上传头像处就停止遍历
  • 对于整个layout区域是可点击,但是其中某个元素是不可点击的,没有进行遍历点击,比如:左上角的设置不能遍历到
  • 对于H5页面无法进行精确的定位点击,比如它的整个布局layout是 一个大模块,不能进行点击(订单详情页)

相关知识

  • appium
  • Xpath
  • appcrawler
  • YAML
  • adb

环境搭建

  • Java环境:安装JDK(8以上)

jdk8下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  • appium

用来开启session服务并定位元素的,也可以使用 appium GUI(桌面版),推荐使用命令行版本的

  • 下载方式:

  • (1)在命令行下执行: npm --registry http://registry.cnpmjs.org install -g appium

  • (2)检查appium所需的环境是否OK(这步很重要):输入 appium-doctor 显示正常则成功

appium-doctor

  • Android SDK

主要是为了使用tools文件夹下的 uiautomatorviewer.bat 来定位元素,获取元素的xpath,用于准备工作前期。

  • appcrawler的最新jar包(最新的功能多,兼容性比较高)

下载地址:百度网盘: https://pan.baidu.com/s/1bpmR3eJ

执行步骤
  1. 开启appium服务:在命令行中输入: appium --session-override
  2. 在放appcrawler-2.1.0.jar 的文件夹下执行以下命令(以懒投资为例):java -jar appcrawler-2.4.0-jar-with-dependencies.jar -a lantouzi_v3.17.0_2019-04-24_ltest_qa.apk -c lantouzi.yml 即可自动启动APP,并自动遍历点击元素;
  3. iOS测试: java –jar appcrawler.jar –c lantouzi.yaml -a lantouzi.app (如果需要连真机测试,需要开发者账号)
  4. 一次control+C 生成报告;两次control+C 强行退出
  5. 默认在当前目录下会生成一个包含输出结果的目录, 以时间命名(也可以通过配置文件中resultDir命名). 包含了如下的测试结果:
    • 所有遍历过的控件组成的思维导图
    • 包含了遍历覆盖的html报告
    • 用于做diff分析的数据文件

02

参数说明:

Java -jar appcrawler.jar 用来启动appcrawler的帮助文档

  • -a, --app Android或者iOS的文件地址, 可以是网络地址, 赋值给appium的app选项(可用于自己手机没有安装包的时候的使用)
  • -e, --encoding set encoding, such as UTF-8 GBK
  • -c, --conf 配置文件地址(后面跟自定义的配置文件的路径和名字)
  • -p, --platform 平台类型android或者ios, 默认会根据app后缀名自动判断
  • -t, --maxTime 最大运行时间. 单位为秒. 超过此值会退出. 默认最长运行3个小时
  • -u, --appium appium的url地址
  • -o, --output 遍历结果的保存目录. 里面会存放遍历生成的截图, 思维导图和日志(后面跟输出的报告所在的文件夹,如果没有写,则会自动生成一个以时间为文件夹名字的报告文件)
  • --capability k1=v1,k2=v2... appium capability选项, 这个参数会覆盖-c指定的配置模板参数, 用于在模板配置之上的参数微调
  • -r, --report 输出html和xml报告
  • --template 输出代码模板
  • --master master的diff.yml文件地址
  • --candidate candidate环境的diff.yml文件
  • --diff 执行diff对比
  • -vv, --verbose 是否展示更多debug信息
  • --demo 生成demo配置文件学习使用方法
  • --help

配置文件

配置文件基本都是以key-value格式,所以可以用文本编辑器,然后改名为 .yml或者.json文件

  • saveScreen: true #是否截图
  • reportTitle: “AppCrawler_lantouzi_qa” #报告名称
  • resultDir: “lantouzi00417” #结果文件夹
  • capability: # appium的capability通用配置
  • testcase: #case
  • triggerActions: #触发操作
  • maxDepth: 10 #遍历深度,默认是10
  • baseUrl: # 设置一个起始url和maxDepth, 用来在遍历时候指定初始状态和遍历深度

参考配置文件

tips

  • 所有的action字段都支持简单的动作和完整的scala编程语句
  • click 点击
  • tap 长按
  • driver.swipe(0.8, 0.8, 0.2, 0.2) 滑动
  • back 后退
  • backApp 从其他的app回退到当前app
  • driver.findElementBy()
  • Thread.sleep(3000)
  • iOS如何获取.app ?
  • 1)打开Xcode,运行模拟器
  • 2)找到模拟器路径即可以找到.app 模拟器路径如下: /Users/[用户文件夹]/Library/Developer/Xcode/DerivedData/ios-asoblvnoubkeiuagchdamsyjsmrw/Build/Products/Debug-iphonesimulator/
  • Android如何获取appPackage和appActivity ?
  • 终端输入aapt dump badging apk 包名,可以通过搜索快速找到对应测试包的package和activity

05

yuml注意

  • 字串不一定要用双引号标识;
  • 在缩排中空白字符的数目并不是非常重要,只要相同阶层的元素左侧对齐就可以了(不过不能使用TAB字符);
  • 允许在文件中加入选择性的空行,以增加可读性;
  • 在同一个文件中,使用---表示一个文档的开始;
  • 也常常使用---来分割不同的内容;
  • ... 和---配合使用,在一个配置文件中代表一个文件的结束。

元素定位

  • Xpath
  • 绝对定位 /xxx/ddd/dddd
  • 相对定位 //android.widget.Button
  • 查找
  • //*
  • //*[contains(@resource-id,'login_btn')]
  • //*[@text='登录']
  • //*[contains(@resource-id,'login_btn') and contains(@text,'登录’)]
  • //*[@clickable="true"]//android.widget.TextView[string-length(@text)>0 and string-length(@text)<20]
  • 正则
  • ^确定$
  • ^输入密码

一些坑

  • npm install -g appium安装总安装不上,报错rollbackFailedOptional: verb npm-session bc8ff681d0fe4711

解决方法:设置镜像,然后通过cnpm安装:

cnpm install -g Appium```

- appium-doctor 一直报错不是内部或外部命令

> 解决方法:需要安装appium-doctor
cnpm install -g appium-doctor

- 检查appium没有成功,有一些红X,根据提示解决

![appcrawlerImg03](static/qa/img/appcrawlerImg/appcrawlerImg03.png)

> * 解决方法:
>  * 1)手动安装Carthage
```brew install carthage```

>  * 2)Manually configure ANDROID_HOME
终端输入~/.bash_profile,打开.bash_profile文件添加:
`export JAVA_HOME=$(/usr/libexec/java_home)
export ANDROID_HOME=/usr/local/android-sdk-macosx`
终端执行 `source ~/.bash_profile` 使环境变量生效

- 在.bash_profile文件中配置的环境变量路径确定没有问题,但是使用appium-doctor检查后一直是✖ ANDROID_HOME is NOT set!

> * 排查原因:
>  * 1)打开.bash_profile文件,输入 echo hello 
>  * 2)打开Mac自带的终端Terminal(不是iTerm2),发现并没有输出我刚刚在.bash_profile中输入的那句Hello from bash_profile!,所以可以判定打开终端时并没有加载.bash_profile文件读取到ANDROID_PATH和JAVA_PATH。
> * 解决方法:
使用bash shell去载入.bash_profile文件, Linux使用Bash作为默认Shell
>  * 1)打开Terminal,终端->偏好设置,发现目前的设置如图1所示,修改为图2所示
>  * 2)再次验证appium-doctor,可见Android环境配置成功

![04](static/qa/img/appcrawlerImg/appcrawlerImg04.png)

- 运行后报错:packageAndLaunchActivityFromManifest failed. Original error: Path must be a string. Received null

> * 解决方法:这是appium的bug导致的. 一般表示没有成功读取app的appPackage和appActivity, 自己在配置文件或者命令行中显式指定即可. 比如
```java -jar appcrawler.jar -a xueqiu.apk --capability appPackage=com.lantouzi.app.dev,appActivity=.view.WelcomeActivityAlias```

- appium报错Error: Could not get Xcode version. /Library/Developer/Info.plist does not exist on disk.

> * 解决方法:原来的路径是/Library/Developer/Commandlinetools改成自己的xcode安装地址。
```sudo xcode-select –reset```
```sudo xcode-select --switch /Applications/Xcode.app```


#### 参考
- Appcrawler:[https://github.com/seveniruby/AppCrawler](https://github.com/seveniruby/AppCrawler)

- yaml: [https://www.jianshu.com/p/97222440cd08](https://www.jianshu.com/p/97222440cd08)

- Xpath: [http://www.w3school.com.cn/xpath/xpath_syntax.asp](http://www.w3school.com.cn/xpath/xpath_syntax.asp)
⚠️ **GitHub.com Fallback** ⚠️