首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

accessibilityNodeInfo AlertDialog的子节点始终为空。如何获取按钮?

AccessibilityNodeInfo是Android中的一个类,用于表示一个可访问的界面元素,例如按钮、文本框等。AlertDialog是Android中的一个对话框类,用于显示一段消息或者用户交互的选项。

当使用AccessibilityService获取界面元素时,有时可能会遇到AccessibilityNodeInfo中的子节点为空的情况。这可能是因为AlertDialog是一个特殊的视图,它的内容是在WindowManager中绘制的,而不是直接作为界面的子节点存在。因此,无法直接通过获取子节点的方式获取AlertDialog中的按钮。

要获取AlertDialog中的按钮,可以尝试以下方法:

  1. 使用AccessibilityService的getRootInActiveWindow()方法获取当前活动窗口的根节点。
  2. 遍历根节点的子节点,查找包含按钮文本的节点。
  3. 如果找到了包含按钮文本的节点,可以使用performAction(AccessibilityNodeInfo.ACTION_CLICK)方法模拟点击按钮。

以下是一个示例代码,展示了如何获取AlertDialog中的按钮:

代码语言:txt
复制
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
    AccessibilityNodeInfo rootNode = getRootInActiveWindow();
    if (rootNode != null) {
        findButtonInAlertDialog(rootNode);
        rootNode.recycle();
    }
}

private void findButtonInAlertDialog(AccessibilityNodeInfo nodeInfo) {
    if (nodeInfo == null) {
        return;
    }

    int childCount = nodeInfo.getChildCount();
    for (int i = 0; i < childCount; i++) {
        AccessibilityNodeInfo childNode = nodeInfo.getChild(i);
        if (childNode != null) {
            // 判断节点类型是否是按钮
            if (childNode.getClassName().equals(Button.class.getName())) {
                // 获取按钮文本
                String buttonText = childNode.getText().toString();
                // 这里可以根据按钮文本做进一步的处理
                // ...
                Log.d(TAG, "Button text: " + buttonText);
            }

            findButtonInAlertDialog(childNode); // 递归查找子节点
            childNode.recycle();
        }
    }
}

需要注意的是,由于AlertDialog的布局结构可能因不同的系统版本和定制化皮肤而有所不同,所以在实际使用中可能需要根据具体情况进行适配。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅供参考,具体的产品选择和推荐应根据具体业务需求进行评估。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用AccessibilityService实现自动遍历点赞功能

实现原理步骤以及难点: 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("**************************:点赞区域

2K20
  • 妙用AccessibilityService黑科技实现微信自动加好友拉人进群聊

    resource-id不一定是唯一 获得控件基本都会通过下述这个方法: getRootInActiveWindow( ):获取当前整个活动窗口节点 返回是一个AccessibilityNodeInfo...类,代表View状态信息, 提供了下述几个非常实用方法: getParent:获取节点。...getChild:获取节点。 performAction:在节点上执行一个动作。 findAccessibilityNodeInfosByText:通过字符串查找节点元素。...后面的这两个方法会返回一个AccessibilityNodeInfo列表,一般操作是 遍历,然后筛选特定节点,比如我程序里,获得底部Tab节点”通讯录”, 然后点击,跳转后遍历,筛选”群聊”...节点,点击。

    3.1K40

    利用无障碍服务(AccessibilityService)批量清理后台进程

    这些事件表示在用户界面中一些状态改变,例如:焦点改变、按钮被点击等。这类服务可以有选择性地请求查询活动窗口内容。...方法获取AccessibilityNodeInfoUI节点信息 AccessibilityNodeInfo nodeInfo = event.getSource(); 通过AccessibilityNodeInfo...findAccessibilityNodeInfosByText 、 findAccessibilityNodeInfosByViewId方法获取你感兴趣UI节点信息 List<AccessibilityNodeInfo...android:accessibilityFlags 指定额外标志 android:canRetrieveWindowContent 指定是否允许我们程序读取窗口中节点和内容 android:description...方法获取后台运行应用程序、服务列表 ActivityManager mActivityManager = (ActivityManager) mAppContext.getSystemService(

    1.9K10

    Android:AccessibilityService辅助功能基础使用(附微信抢红包教程)

    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?.

    6K20

    干货 | Trip.com 智能自动化探索测试

    下面举例如何通过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-idvalue,[1]是称为节点下标。

    1.4K20

    为了保护小姐姐眼睛,我用自动化做了一款语音机器人

    第 3 步,获取公众号文章内容 使用 Android SDK 自带 uiautomatorviewer 打开某一篇公众号文章页面元素树 ?...通过分析,发现一篇文章正文内容都包含在控件中 text 属性中,因此,我们只需要遍历出所有的控件,找出所有 text 属性不为内容。...需要注意是,由于微信基于腾讯 X5 内核,内容包裹在 WebView 内部,直接获取控件是获取不到,因此,需要在服务初始化时候配置 flags 增强 //新建一个服务 @Override protected...,找出所有元素 text 不为内容 /*** * 获取所有的文本内容 * @param webNode * @return */ private void getAllContents...tempContent)) { contents.add(tempContent); } //循环遍历 //判断是否有节点

    76040

    Android辅助功能实现自动抢红包(附源码)

    一、描述 最近看到同事有用抢红包软件,就想看看抢红包具体实现是如何,所以了解了一下,有用辅助功能实现,所以在下面的示例中会展示一个抢红包小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 !

    4.6K20

    通过源码角度看看AccessibilityService

    (String text, boolean clickable) { // 获取当前窗口父节点 AccessibilityNodeInfo accessibilityNodeInfo = getRootInActiveWindow...(); if (accessibilityNodeInfo == null) { return null; } // 获取到满足字符要求节点 List<AccessibilityNodeInfo...方法,可以获取节点信息 通过AccessibilityNodeInfoperformAction方法,最终会在被监听APP中执行对应操作 本篇文章将会围绕着这三点主要功能进行源码分析 源码分析 常见...找到父节点信息后,就可以通过父节点获取对应节点信息了 frameworks/base/core/java/android/view/accessibility/AccessibilityNodeInfo.java...getRootInActiveWindow大概一致,就不详细分析了 #### AccessibilityNodeInfo.performAction 获取到对应节点后,通过performAction

    2.3K11

    从Android手机抢红包插件说起

    按照我们现有的逻辑,自动抢红包大致分为以下几个步骤: 识别获取通知栏微信红包通知事件 点击通知栏消息 获取红包消息 点击按钮拆红包 这里面最最重要两个步骤就是识别,操作。...AccessibilityNodeInfo是什么呢?这相当于一个节点,在AccessibilityService角度来看,这就是一个可访问到控件节点。...我们深入看一下这里getWindowRoots方法关键代码, /** 这里返回活动窗口容器root节点列表 */ AccessibilityNodeInfo[] getWindowRoots...> roots = new HashSet(); // 通过UiAutomation获取当前最底部根窗口容器root节点 AccessibilityNodeInfo...,获取到这个控件节点中心坐标点。

    1.4K40

    Android后台模拟点击探索(附源码)

    这里简单说明一下,AccessibilityService是Android残障人士提供贴心功能,比如可以报出当前页面有哪些按钮balabala。...packageNames:目标包名,比如红包插件就要设置微信包名,关于包名如何获取,下文会提到。...id,可以使用DDMS中Dump View Hierarchy for UI Automator,就是点击下图按钮(不知道如何打开eclipse或者ASDDMS同学可以自行百度): ?...如果有同学使用这种方案,建议根据实际View树结构,自行遍历寻找,我代码如下: /** * 深度优先遍历寻找目标节点 */ private void DFS(AccessibilityNodeInfo...对于如何获取点击位置坐标,可以打开开发者选项中指针位置: ? 直接查看坐标。 总结 模拟点击这种需求,我们一般都不会用到,也有点歪门邪道意思。但是无论什么需求,中间探索过程才最珍贵。

    4.7K40

    免Root实现Apk静默安装,覆盖兼容市场主流98%机型

    最近在做APP自我静默更新,在获取内置情况下,或者已Root过手机是可以完美实现自我静默安装功能,但是发布到市场apk非内置(非system apk) 也非root,所以自我静默安装做起来不太靠谱。...此类事件表示一些状态转换用户界面,例如,界面已经改变, 点击一个按钮,等等。这种服务可以选择请求能力查询活动窗口内容。开发一个可访问性服务需要扩展这个类并实现其抽象方法。...系统通知AccessibilityService AccessibilityEvents节点信息封装在这个类中。..., 返回一个AccessibilityWindowInfo对象。...重写processAccessibilityEvent方法, 用来获得系统当前AccessibilityEvent信息,找出要监测包名和监测view类型以及节点(node)内容 如果是安装apk

    2.3K30

    美团App页面视图可测性改造实践

    接下来我们看一下,这个PartialMatch.accept到底是如何完成元素定位。通过对于源码研究,我们发现元素信息都是存储在一个叫做AccessibilityNodeInfo对象里面。...如何在影响范围较小前提下,达成获取视图信息目标呢?接下来,我们将进一步研究动态布局实现方案。...-XrayServer 我们获取到了信息,接下来就要考虑如何将视图信息传递给自动化测试脚本,我们参考了Appium设计。...图11 WebView页面示例 通过运行在App内部SDK,可以获取到对应WebView实例。通过获取到根节点,从根节点开始进行循环遍历,同时把每个节点信息存储下来就可以得到所有的视图信息了。...提升可靠性测试效率:对于依靠随机或者按照视图信息进行页面随机操作可靠性测试,依赖对于视图信息过滤,也可以只操作可以交互元素(通过过滤元素事件监听器是否)。

    76440

    【Flutter】StatefulWidget 组件 ( 创建 StatefulWidget 组件 | MaterialApp 组件 | Scaffold 组件 )

    : 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 ; 悬浮按钮设置 :

    2K01

    提高Android自动化测试稳定性方法(三)

    小卡片,回复 “合集” 获取系统性学习笔记和测试开发技能图谱 背景 在之前一篇文章《移动端UI自动化过程中难点及应对策略》中,我们提到在Android自动化测试执行过程中经常会遇到一些非预期系统弹框...,我们可以通过无障碍服务来实现智能点击处理,但是通常这个服务只能手动到设置中开启,今天就跟大家分享一下如何实现一个自定义无障碍服务以及如何自动化开启它。..., node)) { findAndPerformCheck("始终允许使用这台计算机进行调试", node) findAndPerformAction..., node)) { findAndPerformCheck("始终允许使用这台计算机进行调试", node) findAndPerformAction...android:resource="@xml/accessibility_service_config" /> 自动开启无障碍服务 可以通过执行下面的命令就可以自动开启指定无障碍服务

    54920
    领券