前言赘述:

本博客只对使用Android AccessibilityService实现自动抢单测试程序Demo的api使用,不对AccessibilityService的类结构及相关配置信息做详细说明,如需了解,请查阅谷歌安卓AccessibilityService的说明文档。

google Android官网AccessibilityService的文档说明:AccessibilityService | Android Developers

我最早是想在哈罗出行上做个脚本来抢单/找单,思考着要如何来实现这样一个功能。用lua脚本?用Android Monkey?很明显,这些都有局限性,实现不了。有一天,我想到某个电视台中的情景:某个电视台中,说的是小米集团(小米手机),在一个工作房间中的机架上整整齐齐的摆放着有上千乃至上万台的手机,每个手机的屏幕都在疯狂的闪烁着。后来才知道原来那是在做自动化交互测试。我在想:我的这个需求功能,是不是也是自动化交互测试方面的技术点?百度了一下,并由此接触到了Android AccessibilityService。

public abstract class AccessibilityService
extends Service

java.lang.Object
   ↳ android.content.Context
     ↳ android.content.ContextWrapper
       ↳ android.app.Service
         ↳ android.accessibilityservice.AccessibilityService

继承于android四大组件之Service,其使用方式与service基本相同。但它是一个系统级别的“监听器”服务,可监听手机上所有应用所产生的小变化、大变化(比如某个被监听应用的发生的点击事件、控件文本内容变化、消息通知等)。另它有自己独立的生命周期(思路有点类似于微信公众号开发中消息与事件的处理),如下:

onCreate()
onServiceConnected()
onAccessibilityEvent(AccessibilityEvent event)//线程阻塞式
onInterrupt()

下面进入主题:

第一步.注册服务

1.1在清单文件中注册服务

<serviceandroid:name=".service.HaloAccessibilityServiceV5"android:enabled="true"android:exported="true"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessibilityservice_setting" />
</service>

1.2meta-data引入配置

<meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessibilityservice_setting" />

1.3accessibilityservice.xml配置信息项

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeAllMask"android:accessibilityFeedbackType="feedbackGeneric"android:accessibilityFlags="flagReportViewIds|flagRetrieveInteractiveWindows"android:canPerformGestures="true"android:canRetrieveWindowContent="true"android:description="@string/accessibilityservice_setting"android:notificationTimeout="100"android:packageNames="填写你要监听的应用完整包名以逗号隔开可填写多个"></accessibility-service>

1.4须手动为apk应用程序打开无障碍权限开关。

位置在设置->快捷与辅助->无障碍,找到自己的apk辅助程序应用,手动将开关打开。

第二步.实现辅助功能

思路:实现辅助功能的关键是接受到事件,并使用AccessibilityService相关api来获取应用控件信息,以及回应适当的事件,来完成"辅助"功能。

1.1下面先来看一下AccessibilityService做为"系统级"服务可以监听到指定应用的哪些事件,或者说可以监听到应用的哪些变化。

Event types支持的事件类型(全面)
AccessibilityEvent#TYPE_VIEW_CLICKED//View控件点击事件
AccessibilityEvent#TYPE_VIEW_LONG_CLICKED//长按事件
AccessibilityEvent#TYPE_VIEW_FOCUSED//焦点事件
AccessibilityEvent#TYPE_VIEW_SELECTED//选择事件
AccessibilityEvent#TYPE_VIEW_TEXT_CHANGED//文本变化
AccessibilityEvent#TYPE_WINDOW_STATE_CHANGED//窗口状态变化
AccessibilityEvent#TYPE_NOTIFICATION_STATE_CHANGED//消息通知状态变化
AccessibilityEvent#TYPE_TOUCH_EXPLORATION_GESTURE_START//手势START
AccessibilityEvent#TYPE_TOUCH_EXPLORATION_GESTURE_END//手势END
AccessibilityEvent#TYPE_VIEW_HOVER_ENTER//悬停
AccessibilityEvent#TYPE_VIEW_HOVER_EXIT//悬停
AccessibilityEvent#TYPE_VIEW_SCROLLED//滚动
AccessibilityEvent#TYPE_VIEW_TEXT_SELECTION_CHANGED//文本选择变化
AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED//窗口连接变化
AccessibilityEvent#TYPE_ANNOUNCEMENT//公告
AccessibilityEvent#TYPE_GESTURE_DETECTION_START//手指检测START
AccessibilityEvent#TYPE_GESTURE_DETECTION_END//手指检测END
AccessibilityEvent#TYPE_TOUCH_INTERACTION_START//触摸互动START
AccessibilityEvent#TYPE_TOUCH_INTERACTION_END//触摸互动END
AccessibilityEvent#TYPE_VIEW_ACCESSIBILITY_FOCUSED//可访问性
AccessibilityEvent#TYPE_WINDOWS_CHANGED//窗口变化
AccessibilityEvent#TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED//可访问性清除

1.2获取应用控件信息的方式有两种

1).通过id寻找控件,id格式为:(包名:id/+制定控件的id),对第三方应用无效。这里引入一个工具,就是Android Sdk下自带的monitor监测器工具,可以使用它来初步的分析第三方应用的页面控件结构,如id、控件文本、层次关系等信息。~/Android/Sdk/tools$ ./monitor。

List<AccessibilityNodeInfo> list = rowNode.findAccessibilityNodeInfosByViewId("com.jingyao.easybike:id/tvAmount");

2).通过控件的text寻找控件

List<AccessibilityNodeInfo> list = rowNode.findAccessibilityNodeInfosByText("不拼车");

1.3.可回应的事件
1)节点可回应执行的操作

android.view.accessibility.AccessibilityNodeInfo#performAction(int action)

android.view.accessibility.AccessibilityNodeInfo#ACTION_CLICK//节点点击
android.view.accessibility.AccessibilityNodeInfo#ACTION_FOCUS
android.view.accessibility.AccessibilityNodeInfo#ACTION_CLEAR_FOCUS
android.view.accessibility.AccessibilityNodeInfo#ACTION_SELECT
android.view.accessibility.AccessibilityNodeInfo#ACTION_CLEAR_SELECTION
android.view.accessibility.AccessibilityNodeInfo#ACTION_CLICK
android.view.accessibility.AccessibilityNodeInfo#ACTION_LONG_CLICK
android.view.accessibility.AccessibilityNodeInfo#ACTION_ACCESSIBILITY_FOCUS
android.view.accessibility.AccessibilityNodeInfo#ACTION_CLEAR_ACCESSIBILITY_FOCUS
android.view.accessibility.AccessibilityNodeInfo#ACTION_NEXT_AT_MOVEMENT_GRANULARITY
android.view.accessibility.AccessibilityNodeInfo#ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY
android.view.accessibility.AccessibilityNodeInfo#ACTION_NEXT_HTML_ELEMENT
android.view.accessibility.AccessibilityNodeInfo#ACTION_PREVIOUS_HTML_ELEMENT
android.view.accessibility.AccessibilityNodeInfo#ACTION_SCROLL_FORWARD
android.view.accessibility.AccessibilityNodeInfo#ACTION_SCROLL_BACKWARD
android.view.accessibility.AccessibilityNodeInfo#ACTION_COPY//复制
android.view.accessibility.AccessibilityNodeInfo#ACTION_PASTE//粘贴
android.view.accessibility.AccessibilityNodeInfo#ACTION_CUT//剪切
android.view.accessibility.AccessibilityNodeInfo#ACTION_SET_SELECTION
android.view.accessibility.AccessibilityNodeInfo#ACTION_EXPAND
android.view.accessibility.AccessibilityNodeInfo#ACTION_COLLAPSE
android.view.accessibility.AccessibilityNodeInfo#ACTION_DISMISS
android.view.accessibility.AccessibilityNodeInfo#ACTION_SET_TEXT
android.view.accessibility.AccessibilityNodeInfo#LAST_LEGACY_STANDARD_ACTION
android.view.accessibility.AccessibilityNodeInfo#ACTION_TYPE_MASK
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_HTML_ELEMENT_STRING
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_SELECTION_START_INT
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_SELECTION_END_INT
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_ROW_INT
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_COLUMN_INT
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_PROGRESS_VALUE
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_MOVE_WINDOW_X
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_MOVE_WINDOW_Y
android.view.accessibility.AccessibilityNodeInfo#ACTION_ARGUMENT_ACCESSIBLE_CLICKABLE_SPAN

2)全局回应可执行的操作
android.accessibilityservice.AccessibilityService#performGlobalAction(int action)

android.accessibilityservice.AccessibilityService#GLOBAL_ACTION_BACK//后退,相当于手机后退按键
android.accessibilityservice.AccessibilityService#GLOBAL_ACTION_HOME//回到手机HOME屏幕
android.accessibilityservice.AccessibilityService#GLOBAL_ACTION_RECENTS
android.accessibilityservice.AccessibilityService#GLOBAL_ACTION_NOTIFICATIONS
android.accessibilityservice.AccessibilityService#GLOBAL_ACTION_QUICK_SETTINGS
android.accessibilityservice.AccessibilityService#GLOBAL_ACTION_POWER_DIALOG
android.accessibilityservice.AccessibilityService#GLOBAL_ACTION_TOGGLE_SPLIT_SCREEN
android.accessibilityservice.AccessibilityService#GLOBAL_ACTION_LOCK_SCREEN
android.accessibilityservice.AccessibilityService#GLOBAL_ACTION_TAKE_SCREENSHOT

第三步.写个自动化测试DEMO应用。

下面贴部分对哈罗出行自动化测试抢单/找单的主要逻辑代码,HaloAccessibilityServiceV5.java

第四步.运行效果

部分Log日志与运行截图(如需完整源码安装包请邮件wangyetao_binary@126.com联系博主):

城际路线
2021-10-06 02:51:04.218 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [0]10月12日 10:00-10:15
2021-10-06 02:51:04.224 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [1]东莞市·华为(凤岗店)
2021-10-06 02:51:04.234 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [2]61.4km
2021-10-06 02:51:04.238 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [3]深圳市·深圳南北小筑客栈
2021-10-06 02:51:04.243 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [4]93.1
2021-10-06 02:51:04.252 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [5]元
2021-10-06 02:51:04.266 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [6]3人
2021-10-06 02:51:04.266 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [7]不拼车
2021-10-06 02:51:04.269 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: FreerideOrder{insertTime='1633459864266', pointoftime='10月12日 10:00-10:15', begin='东莞市·华为(凤岗店)', end='深圳市·深圳南北小筑客栈', fromkm=61.4, price=93.1, peopleNum=3, type='不拼车'}市内路线
2021-10-06 02:52:32.808 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [0]明天 15:30-15:40
2021-10-06 02:52:32.818 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [1]距你12.6km
2021-10-06 02:52:32.822 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [2]石龙广场
2021-10-06 02:52:32.827 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [3]东莞市·南岗
2021-10-06 02:52:32.833 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [4]广州新华学院东莞校区(西门)
2021-10-06 02:52:32.837 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [5]62.7
2021-10-06 02:52:32.841 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [6]元
2021-10-06 02:52:32.849 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [7]已预付
2021-10-06 02:52:32.852 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [8]2人
2021-10-06 02:52:32.852 22973-22973/com.example.driverslanguage I/HaloAccessibilityServiceV5: [9]不拼车

在此记录与总结,2021年 10月 06日 星期三 02:29:23 CST。

免责声明:本程序仅为辅助点击工具与IT开发、测试人员之间交流学习使用,无任何黑科技功能,禁止用于任何违法违规行为,否则后果自负,请遵纪守法。

UPDATE2,完结版本

UPDATE2,完结版本,2021年 10月 29日 星期五 03:25:36 CST

部分软件截图

UPDATE3,衍生版本

UPDATE3,衍生版本,2021年 11月 04日 星期四 20:00:33 CST

v2.0.3.2

v2.0.3.2安装包下载

程序更新地址:
链接: https://pan.baidu.com/s/1D_q_43XaLQZtRCgQ6U-T5Q  密码: pu1s,gif录制的效果图片:

bilibili短视频 【诺亚方舟-哔哩哔哩】 https://b23.tv/Eht88x0

诺亚方舟2.1.5

添加短视频,2021年 12月 28日 星期二 03:52:03 CST。

██哈罗出行自动化测试抢单测试程序相关推荐

  1. 哈罗出行要挑战滴滴,还得靠自己

    在共享单车行业,摩拜被美团收购,ofo深陷资金困境,唯有后来者哈罗单车在阿里巴巴的支持下正快速扩张,据它自己的说法是已在日订单数量方面超越了摩拜和ofo,近期其又改名为哈罗出行并在哈罗APP上线了打车 ...

  2. 哈罗出行2019年4月22日 找零钱问题(动态规划)

    哈罗出行2019年4月22日JAVA岗笔试题: 现存在一堆面值为 N=[n1,n2,n3,--] 面值的硬币,问最少需要多少个硬币才能找出总值为 S的零钱,假设硬币无限. 我的思路:首先将N中能一次取 ...

  3. 哈罗出行是如何实现自动上报的?

    点击上方"程序员黑叔",选择"置顶或者星标" 你的关注意义重大! 来源:哈啰出行-杭州团队 https://segmentfault.com/a/1190000 ...

  4. 想要参加秋招校招的朋友看过来,分享我的2021年春招思科,哈罗出行的面经!

    前言 我投的都是杭州的岗位,23届毕业,所以有些大厂投不了,之后在某网站上发现了信息,遂试一试. 思科 思科是webex 面试用的自然是自家的webex软件,面试官有两个,看起来都和和蔼.大致问题如下 ...

  5. 96年的我成功上岸了,耗时三个月成功拿到了思科,哈罗出行的offer!

    前言 我投的都是杭州的岗位,23届毕业,所以有些大厂投不了,之后在某网站上发现了信息,遂试一试. 思科 思科是webex 面试用的自然是自家的webex软件,面试官有两个,看起来都和和蔼.大致问题如下 ...

  6. [哈罗出行]测试开发面经

    总结一下今天的面试情况叭! 技术面: 1.百年不变的自我介绍 2.对软件测试的理解 3.专业是信息管理与信息系统,学校对这个专业有关计算机方面的培养(其实也就是面试官不太懂这个专业是学啥的,就大概介绍 ...

  7. 哈罗出行数据挖掘实习生电面题 (一面二面)

    (一面) 1.先自我介绍一下自己的背景和接触的项目 : 2.如果一个数据没有明显的相关性 还能放进去LSTM吗: 3.说一下过拟合解决办法: 4.说一下你最熟悉的一个模型: 5.说一下神经网络中怎么解 ...

  8. 忙碌了三个月的王师傅终于上岸了,靠着这份面试大纲我拿到了哈罗出行的offer!

    前言 旷了好几天的面经 今天补 一面 35分钟 一面全程问基础 自我介绍 项目说说 多线程 synchronzied锁升级 concurrenthashmap为什么安全 用的什么锁 锁的哪 说说aqs ...

  9. 哈罗出行电话一面 2021-12-1 52分钟

    问题: Java基础 java集合的数据结构,你使用的了解. hashMap的底层数据结构是怎样的? hashmap构建的时候有什么参数,比如构造因子,构造因子起的什么作用,扩容因子. 怎么解决has ...

最新文章

  1. ROS系统开发——ROS,realsense风险和解决方案备忘录
  2. Memcached深度分析
  3. 占据翻译机市场大半壁江山,科大讯飞现AI新物种
  4. 更新日志 - fir.im「高级统计」功能上线
  5. Python基础---容器集合Set
  6. HTTP/2 流量调试
  7. (Object-C)学习笔记(一)--开发环境配置和与c语言的区别
  8. eclipse lombok插件安装_你干啥的?Lombok
  9. Event.ADDED_TO_STAGE的本质
  10. 还在担心机器人?人工智能目前水平还不如初中生
  11. 现代通信原理4.3:白噪声
  12. hdu2586 lca倍增法
  13. linux下的几种文本去重方法
  14. 一般进入服务器系统的密码,如何查看远程服务器的密码是什么
  15. 12.第十三章.合同管理
  16. android黑色背景图片,android显示PNG图片背景黑色问题 ImageView PNG 背景黑色
  17. visual画图软件_历史最全科技互联网类免费书籍、音乐、照片、软件、招聘信息整理汇总分享...
  18. 腾讯股票接口怎样新建一个历史类数据的编程?
  19. Team Foundation 中的带编号的错误和事件消息
  20. 核电站问题 动态规划

热门文章

  1. 网易云笔记 linux笔记 2
  2. 近日流行香港各大网站的葡萄牙灵异车祸事件~~
  3. 色弱小测试设计与实现(uni-app)
  4. windows动态添加lib的三种方法
  5. 百度地图,移动轨迹详解,逛街偶遇大神解析,受益匪浅
  6. 公众号使用微信客户,微信公众号如何接入微信客服
  7. 手机H5页面如何连接打印机
  8. 倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 88怎么办
  9. poi-tl生成word多张图表及图片
  10. js、jq、实现全国省市级联