实现原理步骤以及难点: 1.首先要获取到微信朋友圈这个界面的ListView结点,或者通过根节点描述判断是否进入该界面。...mUserName.equals("")) { //测试获得评论按钮的父节点,再反推出点赞按钮 List<AccessibilityNodeInfo fuBtns = rootNodeInfo.findAccessibilityNodeInfosByViewId...fuBtn = fuBtns.get(i); LogUtils.d("fuBtn的子节点数量:" + fuBtn.getChildCount());//3-4个 List<AccessibilityNodeInfo...= 0) { //2.如果不为空,则查找有没有自己点过赞,有则不点,没有则点 AccessibilityNodeInfo zanbtn = zanBtns.get(0); LogUtils.d("点赞的人是...getRootInActiveWindow()); return; } } } } } } } } } else { LogUtils.d("**************************:点赞区域为空
故事的背景是这样的:有个应用要跟ERP LN系统对接,使用了ION,需要在外部程序生成XML进行通讯,我用C# .NET写得,但是一开始一直报错。...本以为是ION的设置问题,后来查下来是XML文件中的空节点的标签自动换行,包含了不可见的\n换行字符。...没办法,改程序,将原来的Save写法改为xmlWriter,并设置相关的参数如下,问题解决!
resource-id不一定是唯一的 获得控件基本都会通过下述这个方法: getRootInActiveWindow( ):获取当前整个活动窗口的根节点 返回的是一个AccessibilityNodeInfo...类,代表View的状态信息, 提供了下述几个非常实用的方法: getParent:获取父节点。...getChild:获取子节点。 performAction:在节点上执行一个动作。 findAccessibilityNodeInfosByText:通过字符串查找节点元素。...后面的这两个方法会返回一个AccessibilityNodeInfo列表,一般操作是 遍历,然后筛选特定节点,比如我程序里的,获得底部Tab节点为”通讯录”, 然后点击,跳转后遍历,筛选”群聊”...的节点,点击。
这些事件表示在用户界面中的一些状态的改变,例如:焦点的改变、按钮被点击等。这类服务可以有选择性地请求查询活动窗口的内容。...方法获取AccessibilityNodeInfoUI节点信息 AccessibilityNodeInfo nodeInfo = event.getSource(); 通过AccessibilityNodeInfo...的findAccessibilityNodeInfosByText 、 findAccessibilityNodeInfosByViewId方法获取你感兴趣的UI子节点信息 List<AccessibilityNodeInfo...android:accessibilityFlags 指定额外的标志 android:canRetrieveWindowContent 指定是否允许我们的程序读取窗口中的节点和内容 android:description...方法获取后台运行的应用程序、服务列表 ActivityManager mActivityManager = (ActivityManager) mAppContext.getSystemService(
android:notificationTimeout:两个同样类型的监听事件发给辅助类的最小时间间隔 android:canRetrieveWindowContent:是否可以获取窗口内容,一般设置为...()有什么区别,前者是辅助服务调用的,应该是窗口的根节点,后者是监听到的某个事件获取的,应该是这个事件的源节点,我用Log显示大部分时候两者是一致的。...关键是如何找到这个节点,一种方法是通过ViewId,API AccessibilityNodeInfo.getViewIdResourceName()可以获取这个节点的id,但是你需要事先知道这个节点的...id,而且辅助的配置标记必须是android:accessibilityFlags="flagReportViewIds"才能获取节点的id,可以使用Android Device Monitor或者Layout...contains("android.widget.Button") == true)就认为这个节点是领取红包的按钮,然后执行点击事件:rootInActiveWindow?.
下面举例如何通过AccessibilityNodeInfo获取当前页面所有点击元素: // 递归获取当前节点所有可点击的子节点 public static void getCurrentAllClickViews...第四条避免随机点到返回按钮的问题。 以下面模型图为例,我们介绍App的探索过程。 ? 以A节点作为初始节点,从A节点的事件集合随机选择{e1, e2, e3}一个事件e1 进入B页面。...第4行:获取当前页面下所有有效的事件集合L 第5行:有效事件集合L减去访问事件集合visitedEvents得到剩余待触发事件集合L 第6行:若集合L为空,则跳转至第9行,否则执行第七行 第7~8行:从...参考维基百科上xpath的定义:/A/B/C[1]/D[resource-id='value'] C节点必须是B的子节点(B/C),同时B节点必须是A的子节点(A/B),而A是这个XML文档的根节点。...而D节点是C节点的第二个元素(C[1]),D节点的属性resource-id为value,[1]是称为节点的下标。
第 3 步,获取公众号文章内容 使用 Android SDK 自带的 uiautomatorviewer 打开某一篇公众号文章的页面元素树 ?...通过分析,发现一篇文章的正文内容都包含在控件中 text 属性中,因此,我们只需要遍历出所有的控件,找出所有 text 属性不为空的内容。...需要注意的是,由于微信基于腾讯 X5 内核,内容包裹在 WebView 内部,直接获取控件是获取不到的,因此,需要在服务初始化的时候配置 flags 为增强 //新建一个服务 @Override protected...,找出所有子元素 text 不为空的内容 /*** * 获取所有的文本内容 * @param webNode * @return */ private void getAllContents...tempContent)) { contents.add(tempContent); } //循环遍历 //判断是否有子节点
一、描述 最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下面的示例中会展示一个抢红包的小Demo,附带源码抢红包源码。 二、效果图 ?...,通常将其设置为100即可. android:notificationTimeout="100" //表示该服务是用来单独监听哪个应用的产生的事件,其他的都会过滤,如果不填就是对所有的应用进行监听,填入包名即可...android:packageNames="top.cokernut.sample" //在代码中我们就可以通过node节点来getViewIdResourceName()获取对应的节点的id android...= null) { //把口令粘贴到输入框中 pastaText(chat_edit, MyApp.context, key); //获取QQ聊天页面发送消息按钮 AccessibilityNodeInfo...sendMessage = findViewByID(QQConstant.QQ_CHAT_MESSAGE_SEND); //然后就按下发送按钮 if (sendMessage !
(String text, boolean clickable) { // 获取当前窗口父节点 AccessibilityNodeInfo accessibilityNodeInfo = getRootInActiveWindow...(); if (accessibilityNodeInfo == null) { return null; } // 获取到满足字符要求的节点 List<AccessibilityNodeInfo...方法,可以获取到节点信息 通过AccessibilityNodeInfo的performAction方法,最终会在被监听APP中执行对应操作 本篇文章将会围绕着这三点主要功能进行源码分析 源码分析 常见...找到父节点信息后,就可以通过父节点获取对应的子节点信息了 frameworks/base/core/java/android/view/accessibility/AccessibilityNodeInfo.java...getRootInActiveWindow大概一致,就不详细分析了 #### AccessibilityNodeInfo.performAction 获取到对应子节点后,通过performAction
按照我们的现有的逻辑,自动抢红包大致分为以下几个步骤: 识别获取通知栏的微信红包的通知事件 点击通知栏的消息 获取红包的消息 点击按钮拆红包 这里面最最重要的两个步骤就是识别,操作。...AccessibilityNodeInfo是什么呢?这相当于一个节点,在AccessibilityService的角度来看,这就是一个可访问到的控件节点。...我们深入看一下这里的getWindowRoots方法的关键代码, /** 这里返回活动窗口容器的root节点的列表 */ AccessibilityNodeInfo[] getWindowRoots...> roots = new HashSet(); // 通过UiAutomation获取当前最底部的根窗口容器的root节点 AccessibilityNodeInfo...,获取到这个控件节点的中心坐标点。
private boolean isFinish = false; public static DingService instance; private int index = 1; /** * 获取到短信通知...nodeInfo = getRootInActiveWindow(); if(nodeInfo == null) { Log.w(TAG, "rootWindow为空"); return ; } //...node,ArrayList<String textList){ if(node == null) { Log.w(TAG, "rootWindow为空"); return null; } if(textList...nodeInfo = getRootInActiveWindow(); if(nodeInfo == null) { Log.w(TAG, "点击失败,rootWindow为空"); return false...()){ //没有该文字的控件 Log.w(TAG, "点击失败,"+viewText+"控件列表为空"); return false; }else{ //有该控件 //找到可点击的父控件 AccessibilityNodeInfo
这里简单说明一下,AccessibilityService是Android为残障人士提供的贴心功能,比如可以报出当前页面有哪些按钮balabala。...packageNames:目标包名,比如红包插件就要设置微信包名,关于包名如何获取,下文会提到。...id,可以使用DDMS中的Dump View Hierarchy for UI Automator,就是点击下图按钮(不知道如何打开eclipse或者AS的DDMS的同学可以自行百度): ?...如果有同学使用这种方案,建议根据实际View树的结构,自行遍历寻找,我的代码如下: /** * 深度优先遍历寻找目标节点 */ private void DFS(AccessibilityNodeInfo...对于如何获取点击位置的坐标,可以打开开发者选项中的指针位置: ? 直接查看坐标。 总结 模拟点击这种需求,我们一般都不会用到,也有点歪门邪道的意思。但是无论什么需求,中间的探索过程才最珍贵。
对象可以对事件进行过滤,结合AccessibilitySampleService本身提供的查找节点与模拟点击相关的接口即可实现权限节点的查找与点击。...所以消息是阻塞执行的 // 获取包名 String pkgName = event.getPackageName().toString(); int eventType...也就是说,这个服务要开始为我们服务,还需要去系统界面开启那个开关。...界面节点查找操作 AccessibilityNodeInfo提供两种查找View节点的方法 1....根据View的Text文本进行模糊查找 /** * 根据Text搜索所有符合条件的节点, 模糊搜索方式 */ public List findNodesByText
最近在做APP自我静默更新,在获取内置情况下,或者已Root过的手机是可以完美实现自我静默安装功能,但是发布到市场的apk非内置(非system apk) 也非root,所以自我静默安装做起来不太靠谱。...此类事件表示一些状态转换的用户界面,例如,界面已经改变, 点击一个按钮,等等。这种服务可以选择请求的能力查询活动窗口的内容。开发一个可访问性服务需要扩展这个类并实现其抽象方法。...系统通知的AccessibilityService AccessibilityEvents的节点信息封装在这个类中。..., 返回的为一个AccessibilityWindowInfo对象。...重写processAccessibilityEvent方法, 用来获得系统当前的AccessibilityEvent信息,找出要监测的包名和监测的view类型以及节点(node)内容 如果是安装apk
接下来我们看一下,这个PartialMatch.accept到底是如何完成元素定位的。通过对于源码的研究,我们发现元素的信息都是存储在一个叫做AccessibilityNodeInfo的对象里面。...如何在影响范围较小的前提下,达成获取视图信息的目标呢?接下来,我们将进一步研究动态布局的实现方案。...-XrayServer 我们获取到了信息,接下来就要考虑如何将视图信息传递给自动化测试脚本,我们参考了Appium的设计。...图11 WebView页面示例 通过运行在App内部的SDK,可以获取到对应的WebView实例。通过获取到根节点,从根节点开始进行循环遍历,同时把每个节点的信息存储下来就可以得到所有的视图信息了。...提升可靠性测试效率:对于依靠随机或者按照视图信息进行页面随机操作的可靠性测试,依赖对于视图信息的过滤,也可以只操作可以交互的元素(通过过滤元素事件监听器是否为空)。
"layout_column='1'",他就变成了首列了 "layout_span=2"当前列占用俩列 **特点: tableRow:表示一行,其该节点的每一个子节点表示“一列”... TableLayout的一级子节点还匹配父元素(宽度匹配、但是高度不匹配)。 ...TableRow的子节点的宽和高是包裹内容。...通过 android:maxLines指定 EditText的最大行数为两行,这样当输入的内容超过两行时,文本就会向上滚动,而 EditText则不会再继续拉伸 如何才能让进度条在数据加载完成时消失呢?...的子节点 ll.addView(tv); }//页面并没有实现滑动,所以在布局文件中外层添加一个进行滑动。
: MaterialApp : 材料设计 APP 组件 , 通常用作页面的根节点 ; Scaffold : Flutter 封装的带有 AppBar , 底部导航栏 BottomNavigationBar...组件 ---- 创建空的 dart 文件 StatelessWidgetPage.dart , 导入最基础的材料设计包 , import 'package:flutter/material.dart'...// 子组件, 子组件设置为一个 Column 组件 child: Column( // Column 子组件, 这里设置 Text 文本组件..."AlertDialog 对话框标题"), // 对话框内容 content: Text("AlertDialog 对话框内容"),..., 侧边栏组件 , 使用该组件可以很容易实现一个复杂的导航页面 ; Scaffold 组件常用设置选项 : 顶部标题栏设置 : appBar ; 界面主体子组件设置 : body ; 悬浮按钮设置 :
小卡片,回复 “合集” 获取系统性的学习笔记和测试开发技能图谱 背景 在之前的一篇文章《移动端UI自动化过程中的难点及应对策略》中,我们提到在Android自动化测试执行过程中经常会遇到一些非预期的系统弹框...,我们可以通过无障碍服务来实现智能点击处理,但是通常这个服务只能手动到设置中开启,今天就跟大家分享一下如何实现一个自定义的无障碍服务以及如何自动化的开启它。..., node)) { findAndPerformCheck("始终允许使用这台计算机进行调试", node) findAndPerformAction..., node)) { findAndPerformCheck("始终允许使用这台计算机进行调试", node) findAndPerformAction...android:resource="@xml/accessibility_service_config" /> 自动开启无障碍服务 可以通过执行下面的命令就可以自动开启指定的无障碍服务
由此可以看出UIObject是视图对象,UiSelector是获取视图对象的匹配规则。...在UIObject这个类中我们也可以看到有获取UIObject属性的方法,如: /** * Retrieves the className property of...(getSelector()); 在这个方法中有一个同步的代码块查找根节点: synchronized (mLock) { AccessibilityNodeInfo rootNode...getRootNode()最终调用的是UiAutomation的getRootInActiveWindow方法(与AccessibilityService交互)来获取根节点rootNode。...根节点获取之后,通过递归 translateCompoundSelector遍历 子节点。
领取专属 10元无门槛券
手把手带您无忧上云