当前位置: 首页 > news >正文

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

目录

    • 一、 什么是白屏问题?
    • 二、 问题分析与拆解
      • 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,Bottomelement_rect = uia_element.BoundingRect.AllImageGrab.grab().crop(element_rect).save(file_path)

4.2 后台计算/处理模块

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

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

4.3 前端页面系统

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

在此界面中,可以:

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

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

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

总结

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

相关文章:

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

目录 一、 什么是白屏问题?二、 问题分析与拆解2.1 人工判定一个白屏问题的逻辑2.2 自动化判定一个白屏问题的算法思想 三、 白屏检测算法3.1 图像灰度化3.2 图像二值化3.3 计算(判定为白屏)置信度 四、 白屏检测系统的设计与实现4.1 UI自动化…...

Real-Time Open-Vocabulary Object Detection:使用Ultralytics框架进行YOLO-World目标检测

Real-Time Open-Vocabulary Object Detection:使用Ultralytics框架进行YOLO-World目标检测 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行YOLO-World目标检测进行训练进行预测进行验证 扩展目标跟踪设置提示 参考文献 前言 由…...

区块链用什么编程语言实现?

. 主流区块链的开发语言主要有:C、Go、Java、Rust、C#。 C使用率最高,其次是Go,很少有人用python开发区块链。...

【网络编程】UDP通信基础模型实现

udpSer.c #include<myhead.h> #define SER_IP "192.168.119.143" #define SER_PORT 7777 int main(int argc, const char *argv[]) {//1.创建int sfd socket(AF_INET,SOCK_DGRAM,0);if(sfd -1){perror("socket error");return -1;}//2.连接struct…...

Docker Compose 常用命令详解

Docker Compose 常用命令详解 Docker Compose 是 Docker 官方编排工具之一&#xff0c;用于定义和运行多容器 Docker 应用程序。通过 docker-compose.yml 文件&#xff0c;开发者可以轻松管理服务、网络、卷以及各服务之间的依赖关系。以下将介绍一些常用的 Docker Compose 命…...

超级外链工具,可发9600条优质外链

超级外链工具&#xff0c;是一款在线全自动化发外链的推广工具。使用本工具可免费为网站在线批量增加外链&#xff0c;大大提高外链发布工作效率&#xff0c;是广大草根站长们必备的站长工具。 外链工具只是网站推广的辅助工具&#xff0c;一般适用于短时间内无法建设大量外链…...

VisionPro二次开发学习笔记13-使用CogToolBlock进行图像交互

该程序演示了如何使用CogToolBlock进行图像交互. 从vpp文件中加载一个ToolBlock。 用户可以通过应用程序窗体上的数字增减控件修改ToolBlock输入端子的值。 用户还可以从coins.idb或采集FIFO中选择图像。 “运行一次”按钮执行以下操作&#xff1a; 获取下一个图像或读取下一…...

比特币价格分析:市场重置完成,下一个目标:70,000 美元

比特币再次处于关键支撑位&#xff0c;面临可能影响其短期前景的关键考验。分析师们正密切关注比特币是否重复熟悉的模式&#xff0c;暗示可能出现重大走势。 OKNews分析师Josh表示&#xff0c;比特币一直处于看跌趋势&#xff0c;正如 4 日图上的超级趋势指标所示。这种趋势的…...

大模型笔记5 Extractive QA任务评估

目录 Extractive QA任务评估 Extractive QA评测指标 precision, recall, f1 ROUGE 划分训练与评估数据集 token位置评估 单个token位置评估 输入label的token位置 预测token位置 评估 Wandb 共享机器同时登录 样本类别平衡 标记token label时对窗口进行筛选 训练…...

RCE绕过方式

目录 小于8个字符突破限制 无字母数字执行 php7的做法 php5的思考 PHP5shell 深入理解glob通配符 构造POC&#xff0c;执行任意命令 无参数读文件和RCE总结 代码解读 构造. 另一种构造方法 小于8个字符突破限制 但也只能执行一些非常短的命令&#xff0c;没有什么意义…...

Flutter 电视投屏模块

前言 村里的老人说:“珍爱生命,远离低头族。“ 之前开发的一个 DIM 项目 Tarsier,里面有一个分享视频的功能,同时包含在线视频播放、电视直播等。 考虑到用户在手机上看视频的体验问题,需要增加一个投屏功能,以便用户可以电影、电视直播等投到电视上用大屏幕观看。 用…...

【机器学习】卷积神经网络简介

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 卷积神经网络简介1. 引言2. CNN的基本概念2.1 什么是卷积神经网络2.2 CNN与传统…...

时间函数链接函数等

1. 2.top相当于windows任务管理器 3.命令模式下不加冒号20G直接跳转行数 4. 相当于strcat 5.:13,15y 13行到15行复制 6. Ctrl 右 】是追踪命令 7. vi off_t -t看类型 8. qa关闭所有 9.gg 移动最前面 GG移动到最后面 10.终端中的全选命令1. 使用快捷键&…...

Android控件(示例)

在Android应用程序中&#xff0c;界面由布局和组件组成。布局相当于框架&#xff0c;而控件则是框架里面的内容。了解过Android布局后&#xff0c;如果要设计ui界面&#xff0c;还需要了解和掌握各个控件的应用。 一个界面的设计&#xff0c;先从创建容器开始&#xff0c;再向…...

图论------贝尔曼-福德(Bellman-Ford)算法

算法概述&#xff1a; Bellman-Ford算法核心代码如下 for(int i 1;i<n-1;i) for(int j 1;j<m;j) if(dic[v[j]]> dic[u[j]] w[j]] dic[v[j]] dic[u[j]] w[j]; 首先我们要了解一个点就是我们这次不再使用邻接矩阵来存储图的信息&#xff0c;而是定义三个一维数组来…...

带你彻底搞懂useLayoutEffect的使用场景

开篇第一句: useLayoutEffect 可能会影响性能。尽可能使用 useEffect。 useLayoutEffect 是 useEffect 的一个版本&#xff0c;在浏览器重新绘制屏幕之前触发。 使用方法 useLayoutEffect(setup, dependencies?)调用 useLayoutEffect 在浏览器重新绘制屏幕之前进行布局测量&…...

大厂进阶之二:React高级用法HOC、Hooks对比、异步组件

本文分文三部分&#xff1a; HOC高阶组件 higher order componentHooks 16.8版本后新增的钩子API异步组件使用lazy和suspense两个api实现组件代码打包分割和异步加载 一、HOC高阶组件 1、定义 高阶组件不是组件而是函数&#xff0c;是react中用于复用组件逻辑的高级技巧&am…...

【扒代码】ope.py

文件目录&#xff1a; 引用方式 if not self.zero_shot: # 非零样本情况下&#xff0c;计算边界框的宽度和高度 box_hw torch.zeros(bboxes.size(0), bboxes.size(1), 2).to(bboxes.device) box_hw[:, :, 0] bboxes[:, :, 2] - bboxes[:, :, 0] # 宽度 box_hw[:, :, 1] bbox…...

【Rust光年纪】探索Rust终端编程:从跨平台操作到用户界面设计

构建跨平台终端应用的完美选择&#xff1a;Rust 库综述 前言 随着终端应用程序的发展&#xff0c;越来越多的开发者开始寻找跨平台的、易于使用的库来构建终端用户界面和执行终端操作。本文将介绍几个流行的 Rust 库&#xff0c;它们提供了丰富的功能和灵活的 API 来满足不同…...

67、ceph

一、ceph 1.1、ceph概念 ceph是一个开源的&#xff0c;用c语言写的分布式的存储系统。存储文件数据。 /dev/sdb fdisk /dev/sdb gdisk /dev/sdb lvm 逻辑卷 可以扩容 raid 磁盘阵列 高可用 基于物理意义上的单机的存储系统。 分布式有多台物理磁盘组成一个集群&…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...