黑盒测试中关键截图如何打点

黑盒测试中关键截图如何打点Android黑盒测试过程中如何进行有效的打点是我们经常遇到的问题,我们一般会在脚本内部进行数据打点,也可以使用其他进程录屏或截图。那我们如何选取合适的方式进行打点记录呢?下图是对常用打点方式的统计!对于测试开发人员来说有效的关键截图信息是最直观的数据,可以很快定位问题场景!本文重点介绍如何在Shell进程内统计屏幕截图变化。

第三方服务截图

本方案可以在uiautomator1.0脚本内实现,也可以自定义Shell进程服务来实现。个人推荐自定义Shell服务,然后用app_process命令启动。即使脚本出现异常退出了也不会影响截图服务,并且可以截取脚本启动前和结束后的状态。最主要的是Android R开始不再支持uiautomator1.0脚本。

主要通过Activity监听、定时器、进程监听服务触发截图操作:在页面变化时、进程状态变化时以及定时检测页面状态。除此之外我们需要一个App提供图片相似度的比较,或者搭建其他图片匹配服务也可以。

Activity变化和应用异常时截图

1.首先我们要注册ActivityController

①. 直接通过IActivityController.Stub()方法获取ActivityController对象;

②. 通过ActivityManager的setActivityController方法设置监听,设置成功后切换页面时就会回调对应的方法;

2.我们可以在ActivityController的回调中记录关键截屏信息,主要信息有:

**①. **新打开的Activity:点击按钮跳转页面时;

**②. **恢复显示的Activity:按返回键退回到上一级页面时显示的页面;

**③. **App产生崩溃的详细信息以及截图;

**④. **App产生ANR时的详细信息以及截图;

**⑤. **我们可以在activityStarting和activityResuming方法中对打开的页面进行控制。

3.缺点

**①. **如果其他进程也注册这个服务,那么会相互影响,只有最后注册的服务有效;

**②. **当在页面中切换Fragment时无法感知到事件变化;

**③. **必须在Shell进程内执行,普通App内是无法注册成功的;

IActivityController mActivityController = new IActivityController.Stub() {
    //当调用Activity的onCreate方法(跳转新页面)时回调此方法,
    //return false时不会启动Activity;return true时正常启动Activity
    //不要在这个方法内做耗时操作
    @Override
    public boolean activityStarting(Intent intent, String pkg) throws RemoteException {
        return true;
    }
    //当调用Activity的onResume方法(比如dialog消失)时会调用这个方法
    @Override
    public boolean activityResuming(String pkg) throws RemoteException {
        return true;
    }

    /**
     * 有应用在Java层产生异常时回调此方法
     * 返回true时,会显示应用crash的弹窗,返回false时会立即kill应用
     */
    @Override
    public boolean appCrashed(String processName, int pid, 
        String shortMsg, String longMsg, long timeMillis, 
        String stackTrace) throws RemoteException {
        return false;
    }

    /**
     * 检测到ANR异常时就会回调此方法
     */
    @Override
    public int appEarlyNotResponding(String s, int i, String s1) throws RemoteException {
        return 0;
    }

    /**
     *  应用产生ANR时回调此方法,
     * Return 0 时显示 "应用停止响应" 弹窗。
     * Return 1 时不做任何操作,等待应用恢复正常;
     * Return -1 时结束产生ANR的应用.
     */
    @Override
    public int appNotResponding(String processName, int pid, 
        String processStats) throws RemoteException {
        return -1;
    }

    /**
    * 系统停止响应时回调此方法,可以在这个方法里面对设备进行些恢复工作         
    */
    @Override
    public int systemNotResponding(String msg) throws RemoteException {
        return 0;
    }
};

进程变化监听

由于ActivityController服务存在被干扰的情况,我们需要其他服务进行辅助判断,通过ActivityManager注册IProcessObserver可以获取进程变化的回调,特别是在onForegroundActivitiesChanged方法内可以判断是否触发页面切换。

通过IProcessObserver可以实现的功能:

**①. **在onForegroundActivitiesChanged方法内监听页面变化;

**②. **在onProcessStateChanged和onProcessDied方法内可以统计App的线程生命周期;

**③. **可以统计app运行期间创建的线程信息;

**④. **该服务被不同进程注册时,相互间互不影响;

缺点:

**①. **没有直观信息,需要使用uid进行关联,处理复杂;

IProcessObserver mProcessObserver = new IProcessObserver.Stub() {
    //与用户交互的Activity发生变化时foregroundActivities为true,否则foregroundActivities为false
    //uid产生该活动的应用标识,可以用包信息匹配到具体的应用
    //pid 当前活动的线程/进城ID
    @Override
    public void onForegroundActivitiesChanged(int pid, int uid,
         boolean foregroundActivities) throws RemoteException {
        if(foregroundActivities) {
        //
        }
    }

    //活动状态发生变化时调用,在此方案内实际意义不大
    @Override
    public void onProcessStateChanged(int pid, int uid, int importance) 
        throws RemoteException {
    }
    //结束时调用
    @Override
    public void onProcessDied(int pid, int uid) throws RemoteException {
    }
};

综合应用

上面两种方案各有优劣,我们可以将他们整合在一个流程内实现较为完善的截图机制:

①. 首先我们的服务主要依赖于ActivityController进行页面变化的感知,以便于获取详细的信息和精确控制;

**②. **我们注册IProcessObserver进行辅助验证,当页面发生变化时我们进行截屏,并通过ActivityController最后一次接收事件的时间判断其服务状态,如果服务状态异常,那么我们重新注册ActivityController服务;

**③. **开始监控页面时我们初始化一个定时器,可以定时(2S)截取屏幕,将当前截图Bitmap与上一次的截图Bitmap做图像匹配,如果图片相似度小于0.8,那么可以认定页面发生了变化,如果5S内没有保存过页面信息,那么需要重新初始化ActivityController服务。

Root设备的特殊方案

Android系统是基于Linux系统的移动操作系统。它们可以通过getevent命令输出键盘和屏幕事件,包括响应事件的坐标区域和键盘key值。但是Android系统基于安全考虑,大部分真机系统是没有权限执行getevent命令的,它不会输出任何有效信息,但是华为手机(荣耀20 i)上却可以正常使用。这是一个非常危险的权限,大家自己的手机还是不要开启开发者模式了!

/dev/input/event2: EV_ABS       ABS_MT_POSITION_X    0000024b
/dev/input/event2: EV_ABS       ABS_MT_POSITION_Y    0000065d
/dev/input/event2: EV_ABS       ABS_MT_PRESSURE      000000f5
/dev/input/event2: EV_ABS       ABS_MT_TRACKING_ID   00000000
/dev/input/event2: EV_ABS       ABS_MT_TOUCH_MAJOR   000000a5
/dev/input/event2: EV_ABS       ABS_MT_TOUCH_MINOR   00000087
/dev/input/event2: EV_ABS       ABS_MT_ORIENTATION   ffffffc6
/dev/input/event2: EV_ABS       ABS_MT_BLOB_ID       00000002
/dev/input/event2: EV_SYN       SYN_MT_REPORT        00000000
/dev/input/event2: EV_KEY       BTN_TOUCH            DOWN
/dev/input/event2: EV_SYN       SYN_REPORT           00000000
/dev/input/event2: EV_ABS       ABS_MT_POSITION_X    0000024b
/dev/input/event2: EV_ABS       ABS_MT_POSITION_Y    0000065c
/dev/input/event2: EV_ABS       ABS_MT_PRESSURE      00000067
/dev/input/event2: EV_ABS       ABS_MT_TRACKING_ID   00000000
/dev/input/event2: EV_ABS       ABS_MT_TOUCH_MAJOR   000000b4
/dev/input/event2: EV_ABS       ABS_MT_TOUCH_MINOR   000000a5
/dev/input/event2: EV_ABS       ABS_MT_ORIENTATION   ffffffc1
/dev/input/event2: EV_ABS       ABS_MT_BLOB_ID       00000002
/dev/input/event2: EV_SYN       SYN_MT_REPORT        00000000
/dev/input/event2: EV_SYN       SYN_REPORT           00000000
/dev/input/event2: EV_SYN       SYN_MT_REPORT        00000000
/dev/input/event2: EV_KEY       BTN_TOUCH            UP
/dev/input/event2: EV_SYN       SYN_REPORT           00000000

**ABS_MT_POSITION_X **屏幕的横坐标,后面一列是坐标的十六进制数据

**ABS_MT_POSITION_Y **屏幕纵坐标,后面一列是坐标的十六进制数据

BTN_TOUCH 代表屏幕事件,后面如果是DOWN则代表按下,后面如果是UP代表抬起

我们可以根据ABS_MT_POSITION_X和ABS_MT_POSITION_Y信息和BTN_TOUCH为DOWN的事件计算响应按下事件的屏幕位置,然后通过BTN_TOUCH为UP的事件计算抬起的屏幕位置,然后用按下和抬起的坐标差来判断该时间是点击还是滑动,然后我们可以进行屏幕截图,甚至在截图上绘制事件的轨迹。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/257110.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序流程图的意义(合集)

程序流程图的意义 1、矩形 作用:一般用作要执行的处理(process),在程序流程图中做执行框。 在axure中如果是画页面框架图,那么也可以指代一个页面。有时候我们会把页面和执行命令放在同一个流程中做说明,这个时候将两类不同的矩形…

selenium自动化webdriver下载及安装

1、确认浏览器的版本 在浏览器的地址栏,输入chrome://version/,回车后即可查看到对应版本 2、找到对应的chromedriver版本 2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号(只看大版本)下载对应文件 2.2 116版本通过…

全链路压力测试:解析其主要特点

随着信息技术的飞速发展和云计算的普及,全链路压力测试作为一种关键的质量保障手段,在软件开发和系统部署中扮演着至关重要的角色。全链路压力测试以模拟真实生产环境的压力和负载,对整个业务流程进行全面测试,具有以下主要特点&a…

D35|整数拆分+不同的二叉搜索树

96.不同的二叉搜索树 初始思路: 一开始需要推导递推公式也就是需要找规律: 我认为的规律是 dp[0] 1; dp[1] 1; dp[2] 2; dp[3] dp[2]dp[1]xdp[1]dp[2]5; dp[4] dp[3]dp[2]xdp[1]dp[1]xdp[2]dp[3]; dp[5] dp[4]dp[1]xdp[3]dp[2]xdp[2]dp[3…

详解—C++ [异常]

目录 一、C语言传统的处理错误的方式 二、C异常概念 三、异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3异常安全 3.4 异常规范 四、自定义异常体系 五、C标准库的异常体系 六、异常的优缺点 6.1、C异常的优点: 6.2、C异常的缺点:…

超实用的Web兼容性测试经验总结,建议Mark

在日常工作中,我们经常碰到网页不兼容的问题。我们之所以要做兼容性测试,目的在于保证待测试项目在不同的操作系统平台上正常运行。 主要包括待测试项目能在同一操作系统平台的不同版本上正常运行;待测试项目能与相关的其他软件或系统的“和…

JBoss 4.x JBossMQ JMS 反序列化漏洞CVE-2017-7504 已亲自复现

JBoss 4.x JBossMQ JMS 反序列化漏洞CVE-2017-7504 已亲自复现 漏洞名称影响版本影响版本 漏洞复现环境搭建漏洞利用修复建议 总结 漏洞名称 影响版本 Red Hat JBoss Application Server 是一款基于JavaEE的开源应用服务器。JBoss AS 4.x及之前版本中,JbossMQ实现…

八大易犯领英LinkedIn错误

领英是一个全球知名的职场社交平台,拥有海量的用户,也成为了外贸人开发客户的一个重要平台。但是如果没有很好地避好一些易犯错误,那很可能努力的结果是事倍功半。接下来我来讲解八大容易犯的领英错误。 1、没有完善个人信息 领英是一个职场…

【安全】常见的kali安全工具,小白收藏!!

前言 Kali系统预装了大量的安全工具,可以说是一个安全工具的数据库。在kali2018.2系统中就有600多个工具,工具如此之多,掌握所有的工具是不现实的,只有需要用的时候再去学习工具的使用即可。但是了解这些工具的用途,掌…

Kubernetes 的用法和解析 -- 5

一.企业级镜像仓库Harbo 准备:另起一台新服务器,并配置docker yum源,安装docker 和 docker-compose 1.1 上传harbor安装包并安装 [rootharbor ~]# tar xf harbor-offline-installer-v2.5.3.tgz [rootharbor ~]# cp harbor.yml.tmpl harbor…

新媒体宣传与广州迅腾文化传播有限公司:品牌知名度提升的新动力

新媒体宣传与广州迅腾文化传播有限公司:品牌知名度提升的新动力 随着科技的飞速发展和互联网的普及,新媒体已经成为现代社会不可或缺的一部分。新媒体平台具有传播速度快、覆盖面广的特点,为企业品牌宣传提供了前所未有的机会。广州迅腾文化…

零基础也能制作家装预约咨询小程序

近年来,随着互联网的快速发展,越来越多的消费者倾向于使用手机进行购物和咨询。然而,许多家装实体店却发现自己的客流量越来越少,急需一种新的方式来吸引顾客。而开发家装预约咨询小程序则成为了一种利用互联网技术来解决这一问题…

linux xxd命令(将文件或标准输入转换为hex(十六进制)和ASCII(美国信息交换标准代码)表示,或者从hex dump(十六进制转储)反向到二进制)

文章目录 Linux xxd命令安装xxd基本使用方法创建hex dump从hex dump恢复到二进制 命令选项疑难技术点解析在脚本中使用xxd从hex dump恢复数据 总结 Linux xxd命令 xxd是一个在Linux和UNIX系统中常用的工具,主要用于将文件或标准输入转换为hex(十六进制&…

TCP/IP 传输层协议

传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP(Transmission Control Protocol)和用户数据包协议UDP(User Datagram Protocol)。 TCP协议 TCP是一种面向连接的传输层协议&#…

仿猪八戒威客网整站PHP源码

源码介绍 phpmysql环境。威客开源建站系统,其主要交易对象是以用户为主的技能、经验、时间和智慧型商品。经过多年发展,解决方案成熟,站长用户群稳步增长。产品成为同类开源建站产品的领导者,是搭建在线服务交易平台的首选产品。…

【P2PTransportChannel 】2: 创建Connetion、 BasicPortAllocatorSession

基于m98P2PTransportChannel::MaybeStartGathering() 触发PortAllocator 对 session的管理(创建等) P2PTransportChannel::MaybeStartGathering() session都放在PortAllocator的 一个vector 中:std::vector<std::unique_ptr<PortAllocatorSession>> pooled_sess…

DC-6靶场

DC-6靶场下载&#xff1a; https://www.five86.com/downloads/DC-6.zip 下载后解压会有一个DC-3.ova文件&#xff0c;直接在vm虚拟机点击左上角打开-->文件-->选中这个.ova文件就能创建靶场&#xff0c;kali和靶机都调整至NAT模式&#xff0c;即可开始渗透 首先进行主…

2023年第四届 “赣网杯” 网络安全大赛 gwb-web3 Write UP【PHP 临时函数名特性 + 绕过trim函数】

一、题目如下&#xff1a; 二、代码解读&#xff1a; 这段代码是一个简单的PHP脚本&#xff0c;它接受通过GET请求传递的两个参数&#xff1a;‘pass’和’func’&#xff1a; ① $password trim($_GET[pass] ?? );&#xff1a;从GET请求中获取名为’pass’的参数&#xff0…

解决你的 Nginx 代理跨域问题详细完整版

当你遇到跨域问题&#xff0c;不要立刻就选择复制去尝试。请详细看完这篇文章再处理 。我相信它能帮到你。 分析前准备&#xff1a; 前端网站地址&#xff1a;http://localhost:8080 服务端网址&#xff1a;http://localhost:59200 首先保证服务端是没有处理跨域的&#x…

22.JSP技术

JSP起源 在很多动态网页中&#xff0c;绝大部分内容都是固定不变的&#xff0c;只有局部内容需要动态产生和改变。如果使用Servlet程序来输出只有局部内容需要动态改变的网页&#xff0c;其中所有的静态内容也需要程序员用Java程序代码产生&#xff0c;整个Servlet程序的代码将…