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

相关推荐
Tipriest_7 分钟前
C++ Python使用常用库时如何做欧拉角 ⇄ 四元数转换
c++·python·四元数·欧拉角
Salt_07289 分钟前
DAY 35 文件的规范拆分和写法
python·算法·机器学习
xingzhemengyou117 分钟前
python serial模块使用
python
盼哥PyAI实验室17 分钟前
Python编码处理:解决12306项目的中文乱码问题
开发语言·python
@小码农25 分钟前
6547网:2025年9月 Python等级考试(三级)真题及答案
服务器·数据库·python
Blossom.11840 分钟前
基于多模态大模型的工业质检系统:从AOI到“零样本“缺陷识别的产线实践
运维·人工智能·python·机器学习·自动化·测试用例·知识图谱
雍凉明月夜1 小时前
视觉opencv学习笔记Ⅴ-数据增强(1)
人工智能·python·opencv·计算机视觉
骚戴1 小时前
深入解析:Gemini 3.0 Pro 的 SSE 流式响应与跨区域延迟优化实践
java·人工智能·python·大模型·llm
smj2302_796826521 小时前
解决leetcode第3777题使子字符串变交替的最少删除次数
python·算法·leetcode
0思必得02 小时前
[Web自动化] CSS基础概念和介绍
前端·css·python·自动化·html·web自动化