基于Appium的 App UI 遍历 & Monkey工具 (支持操作步骤回放)

Overview

UICrawler

基于Appium的App UI遍历 & Monkey 工具

关于如何发挥测试工具的价值

  • 用不同的账号登录app运行测试,因为每个账号可能看到的内容不一样
  • 用不同的手机系统版本运行测试,尽可能做到iOS 9-11, Android 4-8 都覆盖到,如果资源有限无法同时运行多台设备,每天可以选择一两个系统版的手机去运行测试
  • 用不同的手机运行测试,尤其安卓碎片化严重,手机厂商多,有的问题只有特定手机才能发现
  • 关于测试运行的频度,只要有代码改动建议至少一天一次,下班时运行,第二天看结果

2.0 版 功能描述

1.UI遍历及以下功能 Android/iOS

  • 基于深度优先的原则,点击UI上的元素。当发现Crash时会提供操作步骤截图及相应的Log.
  •  Android提供logcat的log. 
     iOS提供系统log及crash相应的ips文件
    
  • 元素遍历结束或按下Ctrl + C键会生成HTML测试报告。测试报告中汇集了测试统计、log及截图的相应信息
  • 同一个元素只会点击一次(白名单中的元素可能会被多次点击)
  • 支持对输入框的文本输入(需在文件中进行配置 INPUT_TEXT_LIST)
  • 统计每个Activity点击数量(Android)
  • 支持滑动动作
  • 支持根据关键字、包名、Activity的名字、控件类型触发Back key(Android)
  • 支持自动登录时的自定义操作:点击、拖拽、文本输入。 详见Config.yml中LOGIN_ELEMENTS部分内容
  • 黑名单支持XPath

2.Monkey功能及以下事件 Android/iOS

  • 随机位置点击
  • 通过黑名单控制不想点击的区域
  • 特殊位置点击(需在文件中进行配置)
  • 特殊位置长按10秒(需在文件中进行配置)
  • 任意方向及长度的滑动
  • 触发Home键(Android Only)
  • 触发Back键(Android Only)
  • 重启app
  • 及以下手势操作(位置随机)
  •    双击
       双指放大
       双指缩小
       拖拽
    

3.微信小程序

  • 微信小程序 Monkey (iOS & Android)
  • 微信小程序 UI遍历 (Android only)

4.其它功能

  • 运行时间限制
  • 每次点击都会生一个一截图,截图中被点击的位置会用红点标注,方便查找点击位置
  • 当检查到Crash时,为每个Crash提供单独的操作步骤截图和mp4格式的视频文件
  • 生成整体操作步骤视频,方便重现发现的问题
  • 性能数据采集,执行时添加-e参数
  •    Android : 每秒采集一次CPU和Memory数据 生成perf_data.txt并写放到influxDB(需单添加-x参数,且influxDB要单独安装)
    
  •    iOS: 要求以appium --session-override --relaxed-security 启动appium, 之后会生成XCode instrument能直接读取的性能数据 详见 https://appiumpro.com/editions/12
    

5.待开发功能

  • 优化执行速度,如截图生成,点击等
  • 优化报告显示
  • 优化视频生成
  • 为配置项默认值,无配置文件也能运行
  • 更改demo为Alipay
  • 报告中增加每个activity中click失败和成功的次数统计

运行工具

1.下载Jar包

UICrawler.jar

2.下载配置文件

config.yml

3.根据待测试App修改配置文件中下列各项的值 详情见 Config.md

Android

  • ANDROID_PACKAGE
  • ANDROID_MAIN_ACTIVITY

iOS

  • IOS_BUNDLE_ID
  • IOS_BUNDLE_NAME
  • IOS_IPA_NAME

Monkey配置项可选, 详情见 Monkey配置

4.启动appium

appium --session-override
-p 设定appium server的端口 , 不加参数默认为4723

5.1 运行 UI遍历

java -jar UICrawler.jar -u udid -f config.yml
-u 指定设备udid
-t 指定appium server的端口(此项为可选项,默认值是4723)
-f 指定yml配置文件 若无此参数 默认为config.yml 

5.2 运行 Monkey

java -jar UICrawler.jar -u udid -m

5.3 运行微信小程序测试 -w 启动后会通过微信进入小程序

CRITICAL_ELEMENT:
  MINI_PROGRAM_NAME: 此处值为待测的小程序的名字

java -jar UICrawler.jar -u udid -w

查看支持的参数

java -jar UICrawler.jar -h

    -a  Android package's main activity
    -b  iOS bundle id
    -e  Record performance data
    -f  Yaml config  file
    -h  Print this usage information
    -i  Ignore crash
    -m  Run monkey
    -p  Android package name
    -t  Appium port
    -u  Device serial
    -v  Version
    -z  WDA port for ios
    -x  Write data to influxDB
    -w  Run in wechat mode

一些常用命令

查看设备udid
Android:
  adb devices
  
iOS:
  instruments -s  devices
  idevice_id -l
  idevicecrashreport -e .
  
Android 查看app包名 和 Main activity
  Linux/Mac
    ./aapt dump badging "apk"  | grep launchable-activity
  Windows
    aapt dump badging "apk"  | findstr launchable-activity
    
  aapt 通常在android sdk的 build-tools目录下, "apk"是apk文件路径

Android查看当前activity
    adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'

测试报告

注意事项

  • iOS设备一定要打开"开发者选项"里的“Enable UI Automation” https://www.jianshu.com/p/a1d075b3472c
  • iOS测试包必须是debug版的
  • 同时运行多台ios设备时要每台设备要设置不同的IOS_WDA_PORT : 8001-8888
  • Android7及以上的手机必须安装Uiautomator2 server 的两个apk(安装deskstop版appium,初次连接appium会自动安装), 也可进入到apk目录下通过adb安装

依赖的工具

Known issue

参考内容

一些技术文档

Known issue

CHANGE HISTORY

Comments
  • 运行报这个错误

    运行报这个错误

    D:\UICrawler>java -jar UICrawler.jar -h Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes at sun.security.util.SignatureFileVerifier.processImpl(SignatureFileVerifier.java:284) at sun.security.util.SignatureFileVerifier.process(SignatureFileVerifier.java:238) at java.util.jar.JarVerifier.processEntry(JarVerifier.java:316) at java.util.jar.JarVerifier.update(JarVerifier.java:228) at java.util.jar.JarFile.initializeVerifier(JarFile.java:383) at java.util.jar.JarFile.getInputStream(JarFile.java:450) at sun.misc.URLClassPath$JarLoader$2.getInputStream(URLClassPath.java:776) at sun.misc.Resource.cachedInputStream(Resource.java:77) at sun.misc.Resource.getByteBuffer(Resource.java:160) at java.net.URLClassLoader.defineClass(URLClassLoader.java:442) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:367) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:360) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)

    opened by ren752189 2
  • Bump snakeyaml from 1.26 to 1.31

    Bump snakeyaml from 1.26 to 1.31

    Bumps snakeyaml from 1.26 to 1.31.

    Commits
    • a3e641b Remove unused code for comments
    • d2ed568 Remove unused code
    • ab76f86 Add @​Deprecated annotation to constructs marked with @​deprecated javadoc.
    • bc7869b Make billionLaughsAttackTest.billionLaughsAttackExpanded() robust
    • 4cfb7b7 Merged in make-billion-laughs-attack-test-robust (pull request #7)
    • da5ba16 Update changes.xml
    • 23fbcef add test with JavaBean property of parameterized Collection
    • 6385279 change how we set detected type to JavaBean Collection property item
    • 0468784 force keyNode to be String for JavaBeans
    • 467bcc9 expect node to be scalar when enforcings String keys
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • 执行报错xpath解析错误

    执行报错xpath解析错误

    javax.xml.transform.TransformerException: 需要], 但找到: @ at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(XPathParser.java:612) at com.sun.org.apache.xpath.internal.compiler.XPathParser.consumeExpected(XPathParser.java:530) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Predicate(XPathParser.java:1939) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(XPathParser.java:1728) at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(XPathParser.java:1628) at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(XPathParser.java:1599) at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(XPathParser.java:1319) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(XPathParser.java:1238) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(XPathParser.java:1144) at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(XPathParser.java:1065) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(XPathParser.java:1007) at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(XPathParser.java:932) at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:872) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:836) at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(XPathParser.java:809) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(XPathParser.java:792) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Argument(XPathParser.java:1471) at com.sun.org.apache.xpath.internal.compiler.XPathParser.FunctionCall(XPathParser.java:1539) at com.sun.org.apache.xpath.internal.compiler.XPathParser.PrimaryExpr(XPathParser.java:1448) at com.sun.org.apache.xpath.internal.compiler.XPathParser.FilterExpr(XPathParser.java:1347) at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(XPathParser.java:1280) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(XPathParser.java:1238) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(XPathParser.java:1144) at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(XPathParser.java:1065) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(XPathParser.java:1007) at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(XPathParser.java:932) at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:872) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:836) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:842) at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(XPathParser.java:809) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(XPathParser.java:792) at com.sun.org.apache.xpath.internal.compiler.XPathParser.PredicateExpr(XPathParser.java:1956) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Predicate(XPathParser.java:1938) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(XPathParser.java:1728) at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(XPathParser.java:1628) at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(XPathParser.java:1599) at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(XPathParser.java:1319) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(XPathParser.java:1238) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(XPathParser.java:1144) at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(XPathParser.java:1065) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(XPathParser.java:1007) at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(XPathParser.java:932) at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:872) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:836) at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(XPathParser.java:809) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(XPathParser.java:792) at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(XPathParser.java:131) at com.sun.org.apache.xpath.internal.XPath.(XPath.java:180) at com.sun.org.apache.xpath.internal.XPath.(XPath.java:268) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:191) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:273) at util.XPathUtil.getNodesFromFile(XPathUtil.java:532) at Crawler.main(Crawler.java:487) --------------- linked to ------------------ javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: 需要], 但找到: @ at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:287) at util.XPathUtil.getNodesFromFile(XPathUtil.java:532) at Crawler.main(Crawler.java:487) Caused by: javax.xml.transform.TransformerException: 需要], 但找到: @ at com.sun.org.apache.xpath.internal.compiler.XPathParser.error(XPathParser.java:612) at com.sun.org.apache.xpath.internal.compiler.XPathParser.consumeExpected(XPathParser.java:530) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Predicate(XPathParser.java:1939) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(XPathParser.java:1728) at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(XPathParser.java:1628) at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(XPathParser.java:1599) at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(XPathParser.java:1319) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(XPathParser.java:1238) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(XPathParser.java:1144) at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(XPathParser.java:1065) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(XPathParser.java:1007) at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(XPathParser.java:932) at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:872) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:836) at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(XPathParser.java:809) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(XPathParser.java:792) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Argument(XPathParser.java:1471) at com.sun.org.apache.xpath.internal.compiler.XPathParser.FunctionCall(XPathParser.java:1539) at com.sun.org.apache.xpath.internal.compiler.XPathParser.PrimaryExpr(XPathParser.java:1448) at com.sun.org.apache.xpath.internal.compiler.XPathParser.FilterExpr(XPathParser.java:1347) at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(XPathParser.java:1280) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(XPathParser.java:1238) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(XPathParser.java:1144) at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(XPathParser.java:1065) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(XPathParser.java:1007) at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(XPathParser.java:932) at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:872) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:836) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:842) at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(XPathParser.java:809) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(XPathParser.java:792) at com.sun.org.apache.xpath.internal.compiler.XPathParser.PredicateExpr(XPathParser.java:1956) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Predicate(XPathParser.java:1938) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Step(XPathParser.java:1728) at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelativeLocationPath(XPathParser.java:1628) at com.sun.org.apache.xpath.internal.compiler.XPathParser.LocationPath(XPathParser.java:1599) at com.sun.org.apache.xpath.internal.compiler.XPathParser.PathExpr(XPathParser.java:1319) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnionExpr(XPathParser.java:1238) at com.sun.org.apache.xpath.internal.compiler.XPathParser.UnaryExpr(XPathParser.java:1144) at com.sun.org.apache.xpath.internal.compiler.XPathParser.MultiplicativeExpr(XPathParser.java:1065) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AdditiveExpr(XPathParser.java:1007) at com.sun.org.apache.xpath.internal.compiler.XPathParser.RelationalExpr(XPathParser.java:932) at com.sun.org.apache.xpath.internal.compiler.XPathParser.EqualityExpr(XPathParser.java:872) at com.sun.org.apache.xpath.internal.compiler.XPathParser.AndExpr(XPathParser.java:836) at com.sun.org.apache.xpath.internal.compiler.XPathParser.OrExpr(XPathParser.java:809) at com.sun.org.apache.xpath.internal.compiler.XPathParser.Expr(XPathParser.java:792) at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(XPathParser.java:131) at com.sun.org.apache.xpath.internal.XPath.(XPath.java:180) at com.sun.org.apache.xpath.internal.XPath.(XPath.java:268) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.eval(XPathImpl.java:191) at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.evaluate(XPathImpl.java:273) ... 2 more 16:33:56.024 [main] ERROR Crawler - ------------------------------ERROR. Testing stopped unexpectedly!!!!----------------

    opened by doling0 1
  • Bump snakeyaml from 1.20 to 1.26

    Bump snakeyaml from 1.20 to 1.26

    Bumps snakeyaml from 1.20 to 1.26.

    Commits
    • 9801cc7 Refactor: improve AliasEvent processing
    • a2066e3 Refactor Events: expose Event.ID via a getter
    • 72976f6 Merge
    • 03acd6b Add test for not implemented "!" tag
    • a122a5b Decide not to fix issue 459
    • 952f977 Serializer: release unused resources when closed
    • ccd45df Yaml: improve Javadoc
    • b56ada6 merge
    • bcb8a58 Clean up composer resources
    • 289c35a Apply Sonar improvements
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • change the encoding to gbk while current platform is Windows

    change the encoding to gbk while current platform is Windows

    The encoding of windows is GBK by default, so change the report file's encoding to gbk while current platform is Windows. fix https://github.com/lgxqf/UICrawler/issues/3

    opened by quxiaozha 0
  • 1.0

    1.0

    1.0 版 功能描述

    • 支持Andoird/iOS
    • 支持Monkey功能及以下事件
      • 随机点击
      • 特殊位置点击(需在文件中进行配置)
      • 任意方向及长度的滑动
      • 触发Home键(Android Only)
      • 重启app
    • 基于深度优先的原则,点击UI上的元素。当发现Crash时会提供操作步骤截图及相应的Log.(Android提供logcat的log. iOS提供系统log及crash相应的ips文件)
    • 元素遍历结束或按下Ctrl + C键会生成HTML测试报告。测试报告中汇集了测试统计、log及截图的相应信息
    • 同一个元素只会点击一次(白名单中的元素可能会被多次点击)
    • 每次点击都会生一个一截图,截图中被点击的位置会用红点标注,方便查找点击位置
    opened by lgxqf 0
  • Bump snakeyaml from 1.26 to 1.32

    Bump snakeyaml from 1.26 to 1.32

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump commons-io from 2.4 to 2.7

    Bump commons-io from 2.4 to 2.7

    Bumps commons-io from 2.4 to 2.7.

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • ios的支持模拟器的运行么

    ios的支持模拟器的运行么

    8:34:09.373 [main] INFO util.ConfigUtil - Reading config file /Users/ios/Desktop/config.yml 18:34:09.658 [main] INFO util.ConfigUtil - Config : PORT = 4723 18:34:09.659 [main] INFO util.ConfigUtil - Config : MAX_CLICK_COUNT = 1000000 18:34:09.660 [main] INFO util.ConfigUtil - Config : DB_LOG = false 18:34:09.660 [main] INFO util.ConfigUtil - Config : PERF_LOG = false 18:34:09.660 [main] INFO util.ConfigUtil - Config : DOM_DISPLAY = false 18:34:09.662 [main] INFO util.ConfigUtil - Config : GENERATE_VIDEO = true 18:34:09.669 [main] INFO util.ConfigUtil - Config : VIDEO_VERTICAL = true 18:34:09.670 [main] INFO util.ConfigUtil - Config : DEVICE_NAME = null 18:34:09.674 [main] INFO util.ConfigUtil - Config : APPIUM_SERVER_IP = 0.0.0.0

    opened by willisfeng 0
Releases(1.0)
  • 1.0(May 10, 2018)

    1.0 版 功能描述

    • 支持Andoird/iOS
    • 支持Monkey功能及以下事件
      • 随机点击
      • 特殊位置点击(需在文件中进行配置)
      • 任意方向及长度的滑动
      • 触发Home键(Android Only)
      • 重启app
    • 基于深度优先的原则,点击UI上的元素。当发现Crash时会提供操作步骤截图及相应的Log.(Android提供logcat的log. iOS提供系统log及crash相应的ips文件)
    • 元素遍历结束或按下Ctrl + C键会生成HTML测试报告。测试报告中汇集了测试统计、log及截图的相应信息
    • 同一个元素只会点击一次(白名单中的元素可能会被多次点击)
    • 每次点击都会生一个一截图,截图中被点击的位置会用红点标注,方便查找点击位置
    Source code(tar.gz)
    Source code(zip)
Owner
JustinMa
See the light in others and take them as if that's all you see.
JustinMa
I was fed up with writing Java classes to mirror json models. So I wrote this Java app to automate the process.

Json2Java I was fed up with writing Java classes to mirror json models. So I wrote this Java app to automate the process. What this tool can do right

Jon F Hancock 303 Oct 8, 2022
A plug and play ;) android library for displaying a "rate this app" dialog

Easy Rating Dialog This lib provides a simple way to display an alert dialog for rating app. Default conditions to show: User opened the app more than

Fernando Martínez 111 Dec 30, 2022
Tool for Android app development

RateMeMaybe Asks the user if (s)he wants to open the Play Store to rate your application when certain requirements are met (see below). This can and s

Nicolai Spohrer 98 Dec 30, 2022
Android library that manages your app's cached data with ease.

Teller Android library that makes your apps faster. Teller facilitates the downloading, saving, and reading of the cached data of your app. Keep your

Levi Bostian 14 Apr 2, 2022
Demonstration of calling requestFocusFromTouch() in WebView is changing colors in Android app

webview-changing-colors-bug Demonstration of calling requestFocusFromTouch() in WebView is changing colors in Android app This is the problematic code

Konstantin Tabere 0 Oct 15, 2021
Makes Google play in app purchase library (BillingClient) into a flowable that can easily be used in compose world

Billy the android Our goal is to make a modern api of BillingClient so that it is easier to use in compose world. This library is still early beta and

Stefan Wärting 16 Dec 14, 2022
The Android Version in Kotlin of The Dialer App (in SwiftUI)

Dialer An intuitive USSD client to handle most of the common actions for you. Contains common MTN Rwanda USSD activation codes, which drastically simp

Cédric Bahirwe 1 Dec 14, 2021
Extension for Voisek App on React Native

react-native-voisek-app-extension Voisek App Extension for React Native Installation npm install react-native-voisek-app-extension Usage import Voisek

Omar Ramos Espinosa 2 Dec 21, 2021
Android App development internship project to create woman home screen for clothing company The Swastika.

Android App development internship project to create woman home screen for clothing company The Swastika.

Shradha Suryawanshi 2 Jun 12, 2022
Brief description of the app architecture

Readme App Brief description of the app architecture The application has a simple MVVM architecture based on a single Activity coupled with his own Vi

Alessandro Persiano 0 Nov 2, 2021
Recruitment Task App - record time which a user spends on tasks defined by himself

Recruitment-Task The purpose of this application is to record time which a user spends on tasks defined by himself. The user can add new tasks. New ta

Sylwester Zieliński 0 Feb 9, 2022
Food Recipe App is an app for collecting most of food recipe in one app

Food Recipe App is an app for collecting most of food recipe in one app

Heba Elsaid 10 Dec 25, 2022
Arjun Naik 1 Apr 16, 2022
RecyclerView extension library which provides advanced features. (ex. Google's Inbox app like swiping, Play Music app like drag and drop sorting)

Advanced RecyclerView This RecyclerView extension library provides Google's Inbox app like swiping, Play Music app like drag-and-drop sorting and expa

Haruki Hasegawa 5.2k Dec 23, 2022
Repository that showcases 3 Android app architectures: "Standard Android", MVP and MVVM. The exact same app is built 3 times following the different patterns.

Archi This repository showcases and compares different architectural patterns that can be used to build Android apps. The exact same sample app is bui

Iván Carballo 3.4k Dec 21, 2022
Library to change Android launcher App Icon and App Name programmatically !

AppIconNameChanger Change Android App launcher Icon and App Name programmatically ! Download Demo APK from HERE Kindly use the following links to use

Prabhakar Thota 587 Dec 29, 2022
CrashBottomSheet shows a beautiful BottomSheetDialog when app crashes instead of displaying ugly app stopped working dialog.

CrashBottomSheet Library for Android This library allows android applications to launch a nice beautiful BottomSheetDialog when app crashes instead of

Dheeraj Kumar 11 Dec 22, 2020
This app will show grid overlay over whole system which helps you to verify your excellent app design.

GridWichterle for Android This app will show grid overlay over whole system which helps you to verify your excellent app design. Download: What is the

Inmite s.r.o. 407 Jan 9, 2023