白屏检测系统的设计与实现

news2024/9/21 22:26:58

目录

    • 一、 什么是白屏问题?
    • 二、 问题分析与拆解
      • 2.1 人工判定一个白屏问题的逻辑
      • 2.2 自动化判定一个白屏问题的算法思想
    • 三、 白屏检测算法
      • 3.1 图像灰度化
      • 3.2 图像二值化
      • 3.3 计算(判定为白屏)置信度
    • 四、 白屏检测系统的设计与实现
      • 4.1 UI自动化任务
      • 4.2 后台计算/处理模块
      • 4.3 前端页面系统
    • 总结

一、 什么是白屏问题?

白屏问题即一个APP的某个窗口,由于开发人员的代码有误,导致没有渲染出预期的内容,而只留下空白背景的问题。

以笔者的浅见,这类问题多发生于以下几种开发场景:
1. 窗口嵌套: 如在APP原生窗口A中嵌套上Flutter开发的跨端窗口B
2. Web View: 如在APP中通过浏览器打开渲染一个Web页面

这两种场景都需要原生APP + X的模式来开发,常规情况下可能是两个开发人员或团队。所以经常存在参数没有约定清楚导致窗口出现白屏问题。另外WebView设置的堆栈内存大小,如果限制得太小,或者DOM层级过深,渲染过程中也有可能发生OOM,导致白屏。

因此,需要一种即时的测试方法或工具,可以在新包打好之后快速检测该安装包是否存在白屏Bug,并在发现问题后立即告警,提醒开发人员尽快修复,提高测试效率。

图1 某邮箱APP出现白屏问题的示例

二、 问题分析与拆解

2.1 人工判定一个白屏问题的逻辑

测试人员在安装好一个新的包,对特定的功能展开测试前心里会有一个预期,屏幕中特定的位置应该渲染出特定的控件,或者在进行一些操作后,预期界面中的控件会发生特定的变化。

图1某邮箱APP出现白屏问题的示例,我们可以很清晰的看到,预期的顶部工具栏、左侧账号树、中间的邮件列表、右侧的读信区域,全部没有渲染出来。其中任何一处没有渲染正确就已经很严重了,全部没有渲染出来的严重程度就更不用说。

2.2 自动化判定一个白屏问题的算法思想

  • 判定对象
    自动化测试中,为了便于回溯和排查问题,我们会在特定的步骤执行前后获取当前屏幕的截图,并保存下来。因此截屏是一个常见且必要的操作,我们可以使用这些图片,通过特定的算法对是否出现了白屏问题加以判别。

  • 算法思想
    本文所使用的截图白屏检测算法,其流程如图2所示,具体分为图像灰度化、图像二值化、计算置信度等3个部分,将在下一小节分别做介绍。

图2 白屏检测算法流程

三、 白屏检测算法

一句话说明算法思想: 对图片进行一定的预处理之后,统计出「前景像素点」和「背景像素点」的数量,并计算出比例。当这个比例低于设定的阈值时,判定当前图片中发生了白屏问题。

3.1 图像灰度化

  • 原理: 将3个颜色(即R红色,G绿色,B蓝色)通道的原图像按一定算法转换为由灰度值(即Gray,图像的明暗程度,取值范围[0, 255])单通道表示的图像。
  • 目的: 降低图像数据矩阵的维度,减少后续处理时程序的计算量,提高处理和计算速度。

3.2 图像二值化

  • 原理: 在灰度图的基础上,按照一定的算法选定一个阈值,将灰度值在阈值以下的点灰度值设置为0(即最暗),反之则设置为255(即最亮)。选定阈值的的算法有很多种,本文及所实现的系统采用OSTU算法。
  • 目的: 进一步将我们所需的图像前景信息从背景中完全分离出来,使其更加明显,为下一步的计算提供基础。

3.3 计算(判定为白屏)置信度

  • 原理: 计算二值图中灰度为255的点(即背景点/非前景信息的点)的个数,然后求其在整张二值图中的占比。
  • 目的: 该步骤得到的百分数值即为判断该图片对应的原图是否为一张白屏图像的基础。

四、 白屏检测系统的设计与实现

如图3所示,白屏检测系统除上述算法模块外,还包含UI自动化模块、后台计算/处理模块和前端平台模块3个部分。下面讲逐一进行介绍。

图3 白屏检测系统各模块

4.1 UI自动化任务

前文中说到,白屏检测可以用到现有UI自动化任务的Step截图,只需上传到系统后台的接口即可。另外,针对业务中重点关注的一些白屏高发、易发或核心场景,还可以建立专项的白屏检测UI自动化任务,每日定时执行检测。

特别需要注意的是,如果要检测的界面没有调整到最大化,需要对截屏进行裁剪,只取要检测的部分,如此可以降低系统误判的几率。参考代码如下:

def get_cropped_screenshot(uia_element, file_path):
	"""
	@param uia_element: 需要截取的uia控件,可传入主窗体的实例
	@param file_path: 图片文件存储的路径
	"""
	from PIL import ImageGrab
	# 获取uia控件的坐标,包含Left,Top, Right,Bottom
	element_rect = uia_element.BoundingRect.All
	ImageGrab.grab().crop(element_rect).save(file_path)

4.2 后台计算/处理模块

前文中提及的白屏检测算法也实现在该模块中,该模块的作用即对上传上来的图片进行检测,并将检测结果、图片文件、日志文件进行持久化。

并在一个检测任务执行结束后,如发现了疑似白屏记录,推送告警消息,便于开发人员即时了解到新包的问题,并快速定位、及时修复,提高测试效率。

4.3 前端页面系统

基于前文中所述的算法思想,我们可以快速得实现UI自动化测试任务 + 后台检测模块的最小功能组合。随着测试记录的增多,为了便于查看当前和过往的测试结果,即可按需实现一个前端页面。图4是笔者据此实现的系统某界面。

在此界面中,可以:

  • 查看每次检查的置信度、阈值、结果、图片、时间等信息;
  • 还可以做删除、提单、忽略等操作;
  • 还可以手动对截图进行灰度化、二值化等处理,便于确认处理过程和结果的正确性。

此处因人而异,丰俭由人,不再过多赘述。

图4 白屏检测系统-测试记录界面

总结

白屏检测作为一种辅助检测工具,在实际应用中具有接入简单、通用性高的优点。设定好例行的检测任务后,与客户端的打包流水线结合起来,可以做到包级别的检测粒度和分钟级别的检测效率。以此可以提高测试效率,帮助开发人员快速发现白屏问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

某通用系统0day审计过程

前言 代码审计篇章都是自己跟几个师傅们一起审计的1day或者0day(当然都是小公司较为简单),禁止未经允许进行转载,发布到博客的用意主要是想跟师傅们能够交流下审计的思路,毕竟审计的思路也是有说法的,或者是相互源码共享也OK&…

51单片机之动态数码管显示

一、硬件介绍 LED数码管是一种由多个发光二极管(LED)封装在一起,形成“8”字型的显示器件。它广泛用于仪表、时钟、车站、家电等场合,用于显示数字、字母或符号。 通过控制点亮a b c d e f g dp来显示数字,本实验开发板…

最长的一帧学习(待补)

文章目录 一、osgViewer:: ViewerBase:: frame()1.osgViewer:: View:: init()2.osgViewer::Viewer::realize(),窗口和场景的“设置”工作part1 GraphicsContextpart1.1 通过阅读osgViewer::View::setUpViewInWindow()了解osg最基础的操作 part2 DisplaySettingspart…

《机器学习by周志华》学习笔记-决策树-03

1、连续值处理 到目前为止,我们在决策树01、02中仅讨论了基于离散属性来生成决策树,而现实任务中常会遇到连续属性,所以在本章的学习中,我们将会讨论如何在决策树学习中使用连续属性。 1.1、概念 取值范围是连续的实数值或者整数值的属性就是「连续属性」,与离散属性相对…

Java全栈开发知识图谱(概要)

Java全栈开发知识图谱 基础知识 Java基础 语法面向对象编程(OOP)异常处理集合框架并发编程JVM原理 下列的只是图谱来源与网路 ,仅作为学习笔记使用,侵删。 数据结构和算法 常用数据结构(数组、链表、栈、队列、树等…

通过提示词越狱解锁学习提示词的新姿势

一、什么是提示词越狱 提示词越狱是一种针对语言模型的攻击方法,攻击者通过设计特定的提示词或查询,诱导模型生成不当或有害的内容。这类攻击通常利用模型的脆弱性,绕过其内置的安全机制。通过巧妙的措辞或特殊的结构,攻击者能够…

【ML】为什么multi-lingual bert 有跨语言的能力?M-BERT有什么特点

【ML】为什么multi-lingual bert 有跨语言的能力? 1. Multi-lingual BERT的跨语言能力解析1.1 什么是Multi-lingual BERT?1.2 为什么Multi-lingual BERT有跨语言的能力?1.3 结论 2. 数据量减少对BERT识别能力的影响及Multi-lingual BERT的跨…

删除git中的.idea

删除git中的.idea 1. 修改 .gitignore 文件内容,添加 .idea echo .idea >> ./gitignore2. 删除本地暂存区的 .idea [git rm命令用于从Git仓库中删除文件或目录, 而--cached选项告诉Git仅删除Git索引中的.idea目录,并不会删除本地文件系…

【大数据】重塑时代的核心技术及其发展历程

🐇明明跟你说过:个人主页 🏅个人专栏:《大数据前沿:技术与应用并进》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是大数据 2、大数据技术诞生的背景 二、大…

Java并发编程(七)—ThreadLocal的原理及应用详解

目录 一、ThreadLocal的原理 1、ThreadLocal对象 2、ThreadLocalMap 3、Thread 对象 4、get() 和 set() 方法 5、内存管理 二、ThreadLcoal的应用 三、ThreadLocal扩展问题 四、总结 ThreadLocal 类在 Java 中提供了一种机制,可以在每个线程中存储独立的变…

【Python】基础语法介绍

目录 一、标识符和关键字 二、注释 三、缩进 四、输入和输出 五、字符串操作 六、基本数据类型 七、复合数据类型 7.1 列表 7.2 元组 7.3 字典 7.4 集合 八、数据类型转换 九、运算符 8.1 算术运算符 8.2 比较运算符 8.3 赋值运算符 8.4 位运算符 8.5 逻辑运…

网络编程day1

一、思维导图 网络基础

wordpress全局自适应网址导航整站打包源码,含主题和数据库

wordpress全局自适应网址导航整站打包源码,含主题和数据库。直接恢复就可以使用了。 这个是自适应的布局设计,体验还不错。用网址导航是可以的。 代码免费下载:百度网盘

golang for range time.Ticker 和 time.Timer时间通道使用示例 - 每隔指定时间执行一次,执行指定时长后退出执行

golang中的 ticker和timer时间通道除了可以使用for select case语句来执行外, 还可以使用 for range语句来执行ticker或者timer时间通道。 for range time.Ticker 和 time.Timer时间通道使用示例 下面的示例演示了time.Ticker 和 time.Timer的区别和使用演示。 Ti…

《向量数据库指南》——向量数据库技术积累与商业机会

一豪:Charles提到了一个关键点,就是RAG技术结合模型对非结构化数据的理解和搜索能力,甚至可以很好地架接在传统结构化数据的解决方案中。作为向量数据库的核心技术点,对数据本身特别是非结构化数据的向量化、精炼和压缩,我相信Zilliz等公司有很多独门技巧和技术积累。随着…

UE基础 —— 编辑器界面

菜单栏 UE中每个编辑器都有一个菜单栏,部分菜单会出现在所有编辑器窗口中,如File、Window、Help,其他则是其编辑器特有的; 主工具栏 UE中部分最常用的工具和命令的快捷方式; 1,保存按钮(ctrls&a…

NIO线程模型

NIO线程模型主要涉及以下几个方面: 一、基本概念 NIO(New Input/Output)是Java的一种新的输入输出模型,也被称为非阻塞IO。其核心特点是数据读写操作均是非阻塞的,即在进行读写操作时,若数据未准备好&…

Python第三方库——mrjob的介绍

一、简介 mrjob 是一个强大的 Python 库,它允许开发者以 Pythonic 的方式编写 MapReduce 作业,并在多种环境下运行这些作业,包括本地机器、Hadoop 集群、Amazon Elastic MapReduce (EMR) 和 Google Cloud Dataproc。通过使用 mrjob&#xff…

ARTS Week 37

Algorithm 本周的算法题为 1232. 缀点成线 给定一个数组 coordinates ,其中 coordinates[i] [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。 示例 1:输入:coordinates …

8月9日笔记

8月9日笔记 什么是代理? “代理”通常指的是“网络代理”,它是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。代理服务器作为中间人…