辅助程序实现黑盒自动化测试的常见问题

article/2025/10/6 0:50:03

背景

辅助程序(Accessibility)在大多数机型上具有重启设备后被激活的特性,可以完成Android测试框架(Uiautomator1.0、Uiautomator2.0)无法实现的功能。本文介绍如何搭建辅助程序和如何利用辅助程序进行黑盒测试。并总结了利用辅助程序执行黑盒测试遇到的问题,并在文末总结了各测试方案的应用场景。

辅助程序实现黑盒自动化测试的特点
辅助功能相较于测试框架在部分场景下有一定的优势,可以做更多场景的测试:

  1. 运行辅助程序过程中可以执行Uiautomator1.0或Uiautomator2.0测试用例,执行测试用例过程中辅助程序会被中断,当测试用例执行结束后辅助程序会恢复运行;

  2. 大部分机型重启设备,服务会自动运行,可以测试部分app开机自启功能等功能;

  3. 由于是App方案,所以可以直接读取手机短信,设备插上手机卡后,可以在逻辑数据层拦截短信验证码,实现程序的验证码登陆;

4.辅助程序有较高的优先级,程序保活能力非常强;

自动化软件测试交流群:642830685,领取最新软件测试资料大厂面试和Python自动化、接口、框架搭建学习资料!

由于测试方式是基于Accessibility服务的app,所以也有很多限制:

  1. 和被测应用不在同一进程内,相较于Uiautomator2.0只能做黑盒测试;

  2. 由于是App实现方案,所以在各系统上存在权限问题,不能像Uiautomator1.0一样获取系统运行信息(最近运行的应用、当前显示的activity)

  3. 执行点击动作需要使用AccessibilityNodeInfo#performAction方法,但是此方法只能在clickable=true时生效;

  4. 无法直接操作屏幕,需要借助AccessibilityService的手势功能实现滑动屏幕、点击屏幕等动作;

  5. 由于系统限制,高版本系统中启动其他App失败;

  6. 发送键盘事件受限制,只能发送Home、back、打开通知、打开快捷设置、打开电源弹窗等有限功能;

  7. 辅助程序异常退出时会关闭辅助程序配置,需要在设置页面手动配置;

辅助程序服务配置与黑盒自动化测试实现

自定义AccessibilityService服务,在服务内重载系统方法,

初始化测试服务:重载onServiceConnected方法

当服务激活时调用此方法,在这里进行服务的初始化工作,主要配置onAccessibilityEvent方法感知的事件类型和服务配置。

1、获取AccessibilityServiceInfo 对象:

getServiceInfo()方法获取当前使用的AccessibilityServiceInfo对象,如果方法返回null,直接通过AccessibilityServiceInfo()构造方法创建

AccessibilityServiceInfo accessibilityServiceInfo = getServiceInfo();
if (accessibilityServiceInfo == null) {accessibilityServiceInfo = new AccessibilityServiceInfo();setServiceInfo(accessibilityServiceInfo);
}

2、设置AccessibilityServiceInfo#eventTypes标记过滤AccessibilityEvent事件类型:

直接通过或运算符(|)添加标记,下面代码配置过滤控件点击、控件选择、控件获取焦点和文本变化事件,发生配置的事件时会调用onAccessibilityEvent方法。

accessibilityServiceInfo.eventTypes |= AccessibilityEvent.TYPE_VIEW_CLICKED;
accessibilityServiceInfo.eventTypes |= AccessibilityEvent.TYPE_VIEW_SELECTED;
accessibilityServiceInfo.eventTypes |= AccessibilityEvent.TYPE_VIEW_FOCUSED;
accessibilityServiceInfo.eventTypes |= AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED;

3、 设置AccessibilityServiceInfo#flags配置测试能力:

下面的代码在默认配置基础上增加WebView测试能力。

accessibilityServiceInfo.flags |= AccessibilityServiceInfo.DEFAULT;
accessibilityServiceInfo.flags |= AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY;

AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS标记慎用,如果增加此标记,辅助程序会拦截设备按键事件,会导致点击返回键、home键无效。

4、更新配置信息:
需要调用
AccessibilityServiceInfo#setServiceInfo(AccessibilityServiceInfo info)
方法更新配置。

重载
onAccessibilityEvent(AccessibilityEvent accessibilityEvent)
方法,感知页面变化。

当发生页面变化时回调此方法,可用于触发自动处理弹窗的业务
在这里插入图片描述
重载onInterrupt()方法,释放资源

当系统中断辅助服务时调用(例如执行自动化测试用例),可以在这个方法内释放资源。

配置测试服务

配置清单文件:

需通过meta-data标签指定accessibilityservice配置文件,该文件位于res/xml文件夹下。

<serviceandroid:label="辅助按键服务"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"android:exported="true"android:directBootAware="true"android:name=".service.TaskAccessibilityService"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService"/></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessibility_service_config" />
</service>

属性介绍:
accessibilityservice配置辅助程序属性:

android:description 配置辅助程序描述信息,在设置页面中显示

android:accessibilityFeedbackType 反馈方式

android:canPerformGestures 模拟手势配置,辅助程序滑动屏幕时必须配置此属性为true

android:accessibilityFlags
等同AccessibilityServiceInfo#flags的设置,可以在代码中动态配置

res/xml/accessibility_service_config.xml文件信息:

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/accessibility_service_description"android:accessibilityFeedbackType="feedbackAllMask"android:canRetrieveWindowContent="true"android:canPerformGestures="true"android:notificationTimeout="100"android:accessibilityFlags="flagDefault"/>

AccessibilityService支持动作

下面是AccessibilityService可以直接调用的方法概述,通过下面这些方法可以获取UI测试过程中必要的数据和执行测试动作。
在这里插入图片描述performGlobalAction方法参数为AccessibilityNodeInfo的静态常量:
在这里插入图片描述
dispatchGesture实现点击、滑动滑动屏幕
系统SDK<24时无法点击和滑动屏幕,需要通过AccessibilityNodeInfo的performAction(int action)方法实现UI操作,参数指定ACTION_ACCESSIBILITY_FOCUS获取焦点、ACTION_LONG_CLICK执行长点击、执行ACTION_CLICK点击。

屏幕滑动和点击方法是借助dispatchGesture方法模拟手势实现的,通过Path指定屏幕滑动路径,调用dispatchGesture方法实现Path指定的滑动方式。具体实现代码如下:

Path mPath = new Path();
mPath.moveTo(startX, startY);//滑动的起始点
mPath.lineTo(endX, endY);//滑动终点。不指定lineTo的坐标,只配置moveTo坐标时执行点击动作,点击位置为moveTo指定的坐标。dispatchGesture(new GestureDescription.Builder().addStroke(new GestureDescription.StrokeDescription(mPath, 50, 500)).build(), new GestureResultCallback() {@Overridepublic void onCompleted(GestureDescription gestureDescription) {super.onCompleted(gestureDescription);System.out.println("模拟手势成功");}@Overridepublic void onCancelled(GestureDescription gestureDescription) {super.onCancelled(gestureDescription);System.out.println("模拟手势失败");}}, null);
} else {System.out.println("系统不支持" + Build.VERSION.SDK_INT);
}   

App实现黑盒自动化测试痛点的解决
高版本系统通过intent启动APP失败

Android高版本系统对后台程序启动应用做了严格限制,解决这个问题有下面两种方案

  1. 辅助程序实现悬浮窗功能,在整个测试流程中App属于前台应用,具有启动其他App的权限。缺点:各版本系统适配麻烦,测试过程中会检测到悬浮窗。

  2. 通过UI操作启动App,在桌面滑动寻找被测应用的Launcher图标,然后通过点击操作打开App。

AccessibilityNodeInfo执行performAction失败
performAction方法执行失败是因为对应的AccessibilityNodeInfo不具有对应的操作属性,比如执行点击操作时AccessibilityNodeInfo#isClickable()方法返回false,此时点击操作就会失败。有两种解决方案:

1. 寻找响应事件的AccessibilityNodeInfo执行performAction操作

由于当前AccessibilityNodeInfo无法响应点击事件,那么寻找AccessibilityNodeInfo#isClickable()返回true的父控件执行操作。

public boolean clickNode(AccessibilityNodeInfo nodeInfo){AccessibilityNodeInfo actionNode=null;while (true){actionNode=nodeInfo.getParent();//循环时防止空指针异常if(actionNode==null){return false;}if(actionNode.isClickable()){break;}}//可能存在所有父控件均不可点击情况if(actionNode==null){return false;}actionNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);return false;
}
  1. 如果SDK >= 24,则计算AccessibilityNodeInfo的屏幕坐标,然后点击对应的屏幕坐标即可。
public boolean clickNode(AccessibilityNodeInfo nodeInfo){if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){//获取控件的屏幕坐标Rect rect=new Rect();nodeInfo.getBoundsInScreen(rect);//点击屏幕坐标clickScreen(rect.centerX(),rect.centerY());return true;}else {return false;}
}public void clickScreen(int x, int y) {Path mPath = new Path();mPath.moveTo(x, y);//配置点击坐标if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {dispatchGesture(new GestureDescription.Builder().addStroke(new GestureDescription.StrokeDescription(mPath, 50, 50)).build(), new GestureResultCallback() {@Overridepublic void onCompleted(GestureDescription gestureDescription) {super.onCompleted(gestureDescription);System.out.println("点击成功");}@Overridepublic void onCancelled(GestureDescription gestureDescription) {super.onCancelled(gestureDescription);System.out.println("点击失败");}}, null);} else {System.out.println("系统不支持" + Build.VERSION.SDK_INT);}
}

选择测试方案的建议
以上就是通过App实现黑盒测试的简单介绍,再具体的信息可以查阅Android源码,下面介绍一下几种测试方案的使用场景:

UiAutomator1.0
权限: Shell权限,可以反射系统API实现常用功能,可以绕过Android安全机制,读取最近运行APP、正在运行进程、强杀其他应用;

保活: 保活能力较强,不会被Android系统释放,可以用nohup模式异步运行,即使拔掉数据线也不影响服务(诺基亚手机除外);

场景推荐:适用多App通用测试脚本,便于对脚本做项目扩展;提供远程手机服务接口。Android R(11)模拟器不支持,兼容Android R系统的脚本需要注意。

UiAutomator2.0

权限: 与被测App运行在相同进程内部,与被测APP具有相同权限;

保活: 保活能力差,被测App进程结束时,脚本即停止运行;

场景推荐: 可以直接操作被测App的方法,可以用于白盒测试,对长期维护的重点项目可以用来进行单元测试和复杂业务测试。

辅助程序

权限: 单独的App,跨进程操作,需单独申请app权限;

保活:由于是Android专用场景的服务,所以保活能力非常强,部分机型即使重启后服务依然存在,且不影响UiAutomator测试用例的执行,用例执行结束后服务自动恢复;

自动化软件测试交流群:642830685,领取最新软件测试资料大厂面试和Python自动化、接口、框架搭建学习资料!


http://chatgpt.dhexx.cn/article/UX2H62C0.shtml

相关文章

Android 13 Camera ITS 环境搭建(从Python安装到环境配置详解)

Python 版本 根据CameraITS.pdf 以及报错信息提示需要python版本在3.7.9及以上&#xff0c;本次使用的是3.8.10。 Python 安装 1.官方网站下载Python源码 wget https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tgz 2.进入到下载路径&#xff0c;解压Python文件 …

黑盒测试常见错误类型说明及解决方法有哪些?

目录 1、用户界面错误 2、遗漏信息 3、错误的、误导的或令人迷惑的信息 1、用户界面错误 功能性 易用性&#xff08;用户学习使用程序的时间和记住怎样使用程序的时间&#xff09; 执行速度&#xff08;多数是启动速度&#xff0c;查询速度&#xff0c;刷新速度及响应速度…

浅析黑盒测试与白盒测试

这里写自定义目录标题 黑盒测试黑盒测试常见的测试&#xff1a;黑盒测试常用的方法&#xff1a;等价类划分&#xff1a;边界值分析&#xff1a;因果图分析法、错误推断法&#xff1a; 白盒测试白盒测试常见的方法&#xff1a; 黑盒测试与白盒测试的优缺点二者的优点二者的缺点 …

卸载symantec杀毒软件

(Get-WmiObject -Class Win32_Product -Filter “Name‘Symantec Endpoint Protection’” -ComputerName . ).Uninstall()

schrodinger 薛定谔安装与卸载

schrodinger 薛定谔安装 Windows 版 百度云 链接&#xff1a;https://pan.baidu.com/s/107a4KMHMvg1vrXTFHnGcWw 提取码&#xff1a;c6t4 安装步骤 download所有压缩包&#xff0c;解压任意一个压缩包即可&#xff08;压缩包之间是相互关联的&#xff09;。 进入解压的后的文…

从rookie到基佬~009:无密码卸载Symantec

今天是变直小技巧 今日份洗脑&#xff1a;无密码情况下卸载Symantec&#xff08;赛门铁克&#xff09; 结论&#xff1a;赛门铁克的服务一旦启动&#xff0c;怎么卸载都需要密码&#xff0c;反过来说&#xff0c;你不让他启动&#xff0c;他就是待宰的羔羊。 坐标国内某企业…

赛门铁克下载

Symantec&#xff08;赛门铁克&#xff09;杀毒软件&#xff0c;包括Symantec AntiVirus即SAV系列&#xff0c;Symantec Client Security即SCS系列&#xff0c;以及Symantec Endpoint Protection即SEP系列&#xff0c;都是专门为企业级用户定制的。这3套Symantec杀毒软件均包括…

Symantex Endpoint Protection赛门铁克杀毒软件安装

一、交付邮件 目前软件交付基本都是通过邮件进行。杀毒软件交付邮件中附件包含序列号以及购买产品信息。 二、官网软件下载 在右键中点击“Download Today”跳转下载页面&#xff08;吐槽&#xff1a;交互很差劲&#xff09; 登录网站&#xff1a;https://support.broadcom.…

如何卸载赛门铁克(Symantec)企业防病毒客户端软件SEP(Symantec Endpoint Protection)?

本文分三个部分介绍如何卸载赛门铁克&#xff08;Symantec&#xff09;企业防病毒客户端软件SEP的Windows版本&#xff0c;Linux版本和MacOS版本。 1 卸载SEP for Windows 版本 SEP for Windows版本卸载使用传统办法 -- 通过Windows控制面板卸载是比较容易出问题的&#xff0…

赛门铁克管理密码忘记卸载工具

链接: https://pan.baidu.com/s/1zoolODBkK_ytHh4gPvHFxw?pwd2eea 提取码: 2eea 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 卸载工具已附上 1、安装步骤简单&#xff0c;不多解释。 工具安装到此步骤就可以看到卸载的进度。

MAC卸载赛门铁克

使用 RemoveSymantecMacFiles 卸载适用于 Mac 操作系统的赛门铁克软件 TECH103489 Last Updated August 17, 2018 Situation 您需要卸载安装在 Mac OS X 中适用于 Macintosh 的赛门铁克产品。您已尝试过多种方法&#xff08;包括手动卸载或运行 Symantec Uninstaller&#x…

赛门铁克symantec的安装与卸载-附下载地址(本人亲测)

赛门铁克symantec的安装与卸载 下载地址 1:英文版下载地址 https://www.jb51.net/softs/398259.html 2:中文版下载地址(包含卸载工具) 链接&#xff1a;https://pan.baidu.com/s/1Naes0tUtnJRwAhI5GZ_eYw 提取码&#xff1a;7r2h 一:安装 二:赛门铁克的卸载 1:window卸载…

赛门铁克symantec 卸载需要密码解决方法

1、赛门铁克卸载的时候需要密码&#xff0c;但是不知道密码是什么&#xff0c;试过网上提供的方式怎么尝试都卸载不了&#xff0c;而且提供的卸载器都不是最新的&#xff0c;版本不对就卸载不了 2、赛门铁克卸载需要一个下载工具&#xff0c;官方其实提供了一个卸载文件的下载地…

Symantec赛门铁克安全软件免密卸载方式

装了Symantec后&#xff0c;后面希望卸载他&#xff0c;结果发现卸载需要卸载口令&#xff0c;查了一堆资料&#xff0c;总结有如下几种&#xff1a; 1、卸载口令可能是symantec&#xff0c;反正没成本可以简单试试看。不过我是没有通过&#xff0c;这个口令不对我的Symantec。…

PhotoShop CS6 安装及破解

转载https://blog.csdn.net/danmeng8068/article/details/81407672 软件资源及安装教程参考此贴&#xff1a;http://tieba.baidu.com/p/2742847351?pn1 一、软件下载&#xff1a; http://pan.baidu.com/s/1nv2FaYH 二、安装步骤&#xff1a;

Photoshop2019 安装破解

PS2019安装破解 百度云地址:https://pan.baidu.com/s/1bYC2orWy9pC7XSsPHG5nVQ 提取码&#xff1a;jk1t 安装步骤: 1.解压并安装 2.注册 3.注册完,自动安装,等好长时间… 4.安装完成后会自动打开,关闭就行,关闭后去找程序安装位置 5.将破解文件覆盖过去(以管理员方式) 6.…

PhotoShopCS6安装及其破解【带资源免费】

单机版&#xff0c;断网操作 链接&#xff1a;https://pan.baidu.com/s/1X4OuxiAPvUJZYU2wP9SQvg 提取码&#xff1a;0rug 文后还有其他资源 安装说明&#xff1a; 先解压&#xff0c;Adobe CS6中&#xff0c;Set-up.exe&#xff1b;点击试用&#xff1b;若是忘记断网&am…

ps cs6安装教程

卸载原安装 假如原电脑已有了ps,但是出了问题的,首先要卸载原程序以及原文件 在计算机中点击"卸载或更改程序"(或者在控制面板进入程序与功能),在已安装的程序中找到原来的ps的残留文件 下载新的ps cs6版本 下载链接:链接&#xff1a;https://pan.baidu.com/s/…

破解Photoshop cs6

怎样安装和破解Photoshop CS6&#xff1f; | 浏览&#xff1a;152148 | 更新&#xff1a;2012-10-18 23:46 | 标签&#xff1a;photoshop 1 2 3 4 5 6 7 分步阅读 2012年4月24日&#xff0c;Adobe发布了Photoshop CS6的正式版&#xff0c;在CS6中整合了其Adobe专有的 Mercury图…

ps破解方法

在参考资料中下载CS6&#xff0c; 下载后解压&#xff0c;进入Adobe CS6文件夹&#xff0c;双击Set-up.exe安装程序 2 出来欢迎使用面板&#xff0c;选择【试用】选项 3 在许可协议界面单击【接受】按钮 4 在进行安装之前&#xff0c;先断掉网【禁用网卡或拔掉网线】&#xff0…