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

Python 实现Selenium录屏的一种方法(图片整合成动态图)

由于UI层自动化的不稳定性,经常会遇到执行中断或用例失败的问题,以下是一些常见的措施。

1.详细的日志
2.定位出错时截图
3.Pytest的缓存机制(可以记录成功了哪些失败了哪些)
4.自动重试机制(如pytest-rerunfailures)
5.用例录像

用例录像是最直观的一种方式,可以查看到实时的操作情况。很多云平台如Saucelabs等都提供了用例录像的功能。
然而很遗憾selenium本身没有这种能力。除了借助三方软件如ffmpeg同步录屏外,另外一种实现方法是另外启动一个线程,不断截图,最后将图片拼接成git。
操作方法如下。

实时截图

1.编写一个循环截图函数shot

def shot(dr):
    i = 0
    while True:
        img_file = os.path.join(img_dir, f'{i}.png')
        try:
            dr.save_screenshot(img_file)
        except:
            return
        i += 1
由于webdriver接口执行截图命令的速度限制,每一轮截图无需再sleep。

2.操作web时,启动一个线程

img_dir = 'img'  # 临时图片目录
dr = webdriver.Chrome()

t = threading.Thread(target=shot, args=(dr, img_dir))  # 新建线程
t.start()  # 启动截图线程

dr.get('https://www.baidu.com')
dr.find_element('id', 'kw').send_keys('简书 韩志超')
dr.find_element('id', 'su').click()
time.sleep(1)
dr.get('https://www.qq.com')
dr.back()
time.sleep(2)
dr.quit()

3.图片拼接成gif

需要安装pillow: pip install pillow

img_list = os.listdir(img_dir)  # 列出目录所有图片
img_list.sort(key=lambda x: int(x[:-4]))  # 排序

first_img = Image.open(os.path.join(img_dir, img_list[0]))  # 第一张图片对象
else_imgs = [Image.open(os.path.join(img_dir, img)) for img in img_list[1:]]  # 剩余图片对象

first_img.save("record.gif", append_images=else_imgs,
               duration=300,
               save_all=True) # 拼接保存
               

完整代码

from selenium import webdriver
import threading
import os
import time
from PIL import Image


def clear_dir(path):
    """创建或清空目录"""
    if not os.path.isdir(path):
        os.mkdir(path)  # 创建目录
    else:  # 清空目录
        [os.remove(os.path.join(path, file_name)) for file_name in os.listdir(path)]


def shot(dr, img_dir):
    """循环截图函数"""
    i = 0
    clear_dir(img_dir)  # 清空目录
    while True:
        img_file = os.path.join(img_dir, f'{i}.png')
        try:
            dr.save_screenshot(img_file)
        except:
            return
        i += 1


# Selenium操作
img_dir = 'img'  # 临时图片目录
dr = webdriver.Chrome()

t = threading.Thread(target=shot, args=(dr, img_dir))  # 新建线程
t.start()  # 启动截图线程

dr.get('https://www.baidu.com')
dr.find_element('id', 'kw').send_keys('简书 韩志超')
dr.find_element('id', 'su').click()
time.sleep(1)
dr.get('https://www.qq.com')
dr.back()
time.sleep(2)
dr.quit()

# 图片拼接成gif
img_list = os.listdir(img_dir)  # 列出目录所有图片
img_list.sort(key=lambda x: int(x[:-4]))  # 排序

first_img = Image.open(os.path.join(img_dir, img_list[0]))  # 第一张图片对象
else_imgs = [Image.open(os.path.join(img_dir, img)) for img in img_list[1:]]  # 剩余图片对象

first_img.save("record.gif", append_images=else_imgs,
               duration=300,  # 每张图片的过过渡时间
               save_all=True) # 拼接保存,如果想要循环播放可以加上loop=0

 

相关文章:

Python 实现Selenium录屏的一种方法(图片整合成动态图)

由于UI层自动化的不稳定性,经常会遇到执行中断或用例失败的问题,以下是一些常见的措施。 1.详细的日志 2.定位出错时截图 3.Pytest的缓存机制(可以记录成功了哪些失败了哪些) 4.自动重试机制(如pytest-rerunfailures) 5.用例录像 用例录像是最直观的一…...

【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入传统方案实现实现分析 介绍基本介绍登场角色 案例实现案例一类图实现 案例二类图实现问答 策略模式在JDK源码中的使用总结文章说明 案例引入 有各种鸭子,比如野鸭、北京鸭、水鸭等。 鸭子有各种行为,比如走路、叫、飞行等。不同鸭子的…...

通讯商二要素Api接口验证真伪

随着互联网的普及和各种社交平台、电商平台、金融平台的发展,许多业务都需要用户进行实名认证,这也就涉及到了手机号码和姓名的验证问题。为了解决这个问题,现在有很多运营商提供的二要素API接口能够进行手机号码和姓名的验证,本文…...

React源码解析18(6)------ 实现useState

摘要 在上一篇文章中,我们已经实现了函数组件。同时可以正常通过render进行渲染。 而通过之前的文章,beginWork和completeWork也已经有了基本的架子。现在我们可以去实现useState了。 实现之前,我们要先修改一下我们的index.js文件&#x…...

MongoDB的下载和安装

一、MongoDB下载 下载地址:https://www.mongodb.com/try/download/community 二、安装 因为选择下载的是 .zip 文件,直接跳过安装,一步到位。 选择在任一磁盘创建空文件夹(不要使用中文路径),解压之后把…...

如何卖 Click to WhatsApp 广告最有效

2022年,大多数直接面向消费者的品牌都面临相同挑战—— Facebook 和 Instagram 的广告成本大幅增加。Business Insider 报导指出,2021年 Facebook 广告每次点击的平均成本(average cost per click)达到0.974美元,按年升…...

【UE4 RTS】10-RTS HUD Setup

前言 本篇博文主要制作了一个控件蓝图界面,用于显示当前的游戏时间 效果 步骤 1. 新建一个名为“Widgets”的文件夹 在该文件夹中新建一个控件蓝图,命名为“GameTime_HUD” 打开“GameTime_HUD”,添加如下控件 2. 打开玩家控制器“RTS_Pla…...

Python生成指定大小文件:txt/图片/视频/csv

如题,做测试的懂的都懂,不多解释 相比其他大佬,本脚本基于gpt编写后整理,生成的文件更真实,能够打开预览,看过其他人的生成脚本,只是一个符合大小,但是是空白或不能打开的文件。 话…...

Arcgis中影像图切片有白斑或者白点

效果 步骤 1、3dmax渲染或者其它原片 2、Arcgis中加载图片 原数据效果 3、定义投影和转换坐标系等等 我这边测试数据是EPSG:4326的坐标系 4、导出jp2(JPG2000)格式 转换后效果 5、发布服务 6、效果对比...

nlohmann json:通过[ ]运算符读取设置object/array

除了可以通过at,还可以通过[ ]运算符来读取和设置object/array #include <iostream> #include <nlohmann/json.hpp> using namespace std; using json = nlohmann::json;int main() {json data = R"({"name": "xiaoming","age&quo…...

rust学习-tokio::time

示例 use std::time::Duration; use tokio::{task, time::interval};#[tokio::main] async fn main() {let mut interval interval(Duration::from_secs(1));let handle task::spawn(async move {loop {interval.tick().await;println!("tick");}});handle.await.…...

Java 中 List 集合排序方法

方式一&#xff1a; 调用List接口自己的sort方法排序 public static void main(String[] args) {List<Integer> numListnew ArrayList<>();numList.add(999);numList.add(123);numList.add(456);numList.add(66);numList.add(9);Collections.sort(numList); //使…...

prometheus监控k8s服务并告警到钉钉

一、监控k8s集群 要监控k8s集群需要使用到以下服务用于收集监控的资源信息&#xff0c;node_exporter用于监控k8s集群节点的资源信息&#xff0c;kube-state-metrics用于监控k8s集群的deployment、statefulset、daemonset、pod等的状态&#xff0c;cadvisor用于监控k8s集群的p…...

Go和Java实现解释器模式

Go和Java实现解释器模式 下面通过一个四则运算来说明解释器模式的使用。 1、解释器模式 解释器模式提供了评估语言的语法或表达式的方式&#xff0c;它属于行为型模式。这种模式实现了一个表达式接口&#xff0c;该接口 解释一个特定的上下文。这种模式被用在 SQL 解析、符…...

域名配置HTTPS

一、注册域名 这个可以在各大平台注册&#xff0c;具体看一下就会注册了&#xff0c;自己挑选一个自己喜欢的域名。 步骤一般也就是先实名&#xff0c;实名成功了才能注册域名。 二、办理SSL证书 这里使用的是阿里云的SSL免费证书 1、申请证书 二、填写申请 三、域名绑定生…...

机械设计cad,ug编程设计,ug模具设计,SolidWorks模具设计

模具设计培训课程&#xff1a; 【第一阶段&#xff1a;CAD识图制图】 [AutoCAD机械制图]&#xff1a;全面讲解AUTOCAD应用知识&#xff0c;常用命令讲解与运用&#xff0c;二维平面图绘制&#xff0c;三维成型零件的绘制与设计&#xff0c;制作工程图 【第二阶段&#xff1a;U…...

嵌入式开发的学习与未来展望:借助STM32 HAL库开创创新之路

引言&#xff1a; 嵌入式开发作为计算机科学领域的重要分支&#xff0c;为我们的日常生活和产业发展提供了无限的可能。STMicroelectronics的STM32系列芯片以其出色的性能和广泛的应用领域而备受关注。而STM32 HAL库作为嵌入式开发的高级库&#xff0c;为学习者提供了更高效、更…...

WPS-0DAY-20230809的分析和利用复现

WPS-0DAY-20230809的分析和初步复现 一、漏洞学习1、本地复现环境过程 2、代码解析1.htmlexp.py 3、通过修改shellcode拿shell曲折的学习msf生成sc 二、疑点1、问题2、我的测试测试方法测试结果 一、漏洞学习 强调&#xff1a;以下内容仅供学习和测试&#xff0c;一切行为均在…...

MongoDB(三十九)

目录 一、概述 &#xff08;一&#xff09;相关概念 &#xff08;二&#xff09;特性 二、应用场景 三、安装 &#xff08;一&#xff09;编译安装 &#xff08;二&#xff09;yum安装 1、首先制作repo源 2、软件包名&#xff1a;mongodb-org 3、启动服务&#xff1a…...

InnoDB引擎

1 逻辑存储结构 InnoDB的逻辑存储结构如下图所示: 1). 表空间 表空间是InnoDB存储引擎逻辑结构的最高层&#xff0c; 如果用户启用了参数 innodb_file_per_table(在8.0版本中默认开启) &#xff0c;则每张表都会有一个表空间&#xff08;xxx.ibd&#xff09;&#xff0c;一个…...

ComfyUI-Impact-Pack:AI图像精细化增强的3大突破性技术革命

ComfyUI-Impact-Pack&#xff1a;AI图像精细化增强的3大突破性技术革命 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址: htt…...

大麦抢票终极指南:告别手速焦虑,轻松锁定心仪演出门票

大麦抢票终极指南&#xff1a;告别手速焦虑&#xff0c;轻松锁定心仪演出门票 【免费下载链接】ticket-purchase 大麦自动抢票&#xff0c;支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 面对热门演唱会门票&q…...

微软Windows拆分:云AI战略转型下的业务重构与行业影响

1. 从“巨无霸”到“手术台”&#xff1a;微软拆分的深层逻辑与行业变局最近几年&#xff0c;关于微软可能进行业务拆分的讨论&#xff0c;就像科技行业的“月经帖”&#xff0c;每隔一段时间就会冒出来。但这一次&#xff0c;市场的风声似乎比以往任何时候都要紧。从“拆分Win…...

Win11Debloat:Windows系统优化利器,一键清理臃肿应用与隐私设置

Win11Debloat&#xff1a;Windows系统优化利器&#xff0c;一键清理臃肿应用与隐私设置 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes…...

从零开始接入 Taotoken,新用户注册到首次成功调用的全过程耗时

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从零开始接入 Taotoken&#xff0c;新用户注册到首次成功调用的全过程耗时 对于开发者而言&#xff0c;评估一个新工具或平台的接入…...

Qt Widgets实战:用QCheckBox三态复选框搞定复杂表单选项(附QButtonGroup管理技巧)

Qt Widgets实战&#xff1a;用QCheckBox三态复选框搞定复杂表单选项&#xff08;附QButtonGroup管理技巧&#xff09; 在开发配置型软件界面时&#xff0c;表单中的复选框组往往需要处理比"全选/全不选"更复杂的业务逻辑。想象一个邮件客户端的通知设置面板&#xff…...

ARMv8调试状态下LDR指令未定义问题解析

1. 问题背景与现象分析在ARMv8-A架构的调试过程中&#xff0c;开发者经常会遇到一个令人困惑的现象&#xff1a;当外部调试器暂停核心执行后&#xff0c;向EDITR寄存器注入LDR X1, [X0]指令&#xff08;机器码0xf9400001&#xff09;时&#xff0c;Tarmac日志显示该指令被标记为…...

VideoDownloadHelper:免费视频下载插件终极使用指南

VideoDownloadHelper&#xff1a;免费视频下载插件终极使用指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否经常遇到想要保存网页视…...

终极指南:Claude Desktop Debian版脚本自动化批量操作与任务调度全攻略

终极指南&#xff1a;Claude Desktop Debian版脚本自动化批量操作与任务调度全攻略 【免费下载链接】claude-desktop-debian Claude Desktop for Linux 项目地址: https://gitcode.com/GitHub_Trending/cl/claude-desktop-debian Claude Desktop Debian版是一款强大的Li…...

抖音下载神器:如何免费批量下载无水印视频、音乐和图片

抖音下载神器&#xff1a;如何免费批量下载无水印视频、音乐和图片 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...