SeleniumBase截图与录屏功能:测试证据收集完全指南
引言:测试证据收集的痛点与解决方案
你是否还在为测试失败后无法复现问题而烦恼?是否因缺乏直观的测试过程记录而难以定位bug?在自动化测试中,截图和录屏是不可或缺的证据收集手段。SeleniumBase作为一款强大的Python测试框架,提供了全面的截图功能和灵活的录屏方案,帮助测试工程师高效捕获测试过程中的关键瞬间。本文将详细介绍SeleniumBase的截图功能、录屏方案及最佳实践,让你轻松掌握测试证据收集的完整流程。
读完本文后,你将能够:
- 熟练使用SeleniumBase的各种截图方法
- 掌握测试过程中的截图策略与最佳实践
- 了解SeleniumBase的录屏方案及第三方集成方法
- 构建完整的测试证据收集体系
SeleniumBase截图功能详解
截图方法概览
SeleniumBase提供了多种截图方法,满足不同场景下的证据收集需求。以下是主要的截图方法及其用途:
| 方法名 | 描述 | 适用场景 |
|---|---|---|
save_screenshot(name, folder=None, selector=None) | 保存当前页面截图到指定文件夹 | 手动触发关键步骤截图 |
save_screenshot_to_logs(name=None, selector=None) | 保存截图到日志目录,自动命名 | 测试用例失败自动截图 |
save_element_as_image_file(selector, file_name, folder=None, overlay_text="") | 保存指定元素为图片 | 单独捕获特定UI元素 |
基础截图功能实战
1. 保存页面截图到指定目录
from seleniumbase import BaseCase
class MyTestClass(BaseCase):
def test_save_screenshot(self):
self.open("https://seleniumbase.io/demo_page")
# 保存截图到"./downloaded_files"目录
self.save_screenshot("demo_page.png", folder="./downloaded_files")
# 验证截图是否成功保存
self.assert_downloaded_file("demo_page.png")
print(f'截图已保存至: ./downloaded_files/demo_page.png')
此方法允许你自定义截图文件名和保存路径,适用于需要手动标记关键测试步骤的场景。文件夹参数支持相对路径和绝对路径,若目录不存在会自动创建。
2. 自动保存截图到日志目录
def test_save_screenshot_to_logs(self):
self.open("https://seleniumbase.io/demo_page")
# 不带参数调用,自动命名并保存到日志目录
self.save_screenshot_to_logs()
# 获取日志路径
test_logpath = os.path.join(self.log_path, self.test_id)
# 验证截图是否存在
expected_screenshot = os.path.join(test_logpath, "_1_screenshot.png")
self.assert_true(os.path.exists(expected_screenshot))
# 带自定义名称保存
self.open("https://seleniumbase.io/error_page/")
self.save_screenshot_to_logs("error_page")
expected_screenshot = os.path.join(test_logpath, "_2_error_page.png")
self.assert_true(os.path.exists(expected_screenshot))
save_screenshot_to_logs方法会自动将截图保存到./latest_logs/[test_case_id]/目录下,并根据调用顺序自动编号。当测试用例失败时,SeleniumBase也会自动调用此方法保存失败时的页面状态。
高级截图技巧
1. 元素级截图
def test_save_element_screenshot(self):
self.open("https://seleniumbase.io/demo_page")
# 保存指定元素为图片
self.save_element_as_image_file(
"#demoElement",
"demo_element.png",
folder="./element_screenshots",
overlay_text="关键按钮元素" # 添加文字水印
)
self.assert_true(os.path.exists("./element_screenshots/demo_element.png"))
save_element_as_image_file方法通过CSS选择器定位元素并捕获其图像,适用于需要单独验证UI组件的场景。overlay_text参数可添加水印文字,便于后续识别。
2. 条件截图与异常处理
def test_conditional_screenshots(self):
try:
self.open("https://seleniumbase.io/demo_page")
self.click("#non_existent_element") # 故意触发错误
except Exception as e:
# 异常发生时保存截图
self.save_screenshot("error_occurred.png", folder="./error_screenshots")
self.fail(f"测试失败: {str(e)}")
finally:
# 无论成功失败都保存最终状态
self.save_screenshot_to_logs("test_complete")
结合异常处理机制,可实现测试失败时自动截图,帮助定位问题。finally块中的截图确保即使测试失败也能记录最终状态。
截图功能配置与优化
1. 全局配置调整
在seleniumbase/config/settings.py中可调整截图相关全局设置:
# 截图图片质量 (0-100)
SCREENSHOT_QUALITY = 85
# 是否在截图中包含时间戳
SCREENSHOT_INCLUDE_TIMESTAMP = True
# 默认截图保存目录
DEFAULT_SCREENSHOT_DIR = "screenshots"
2. 命令行参数控制
运行测试时可通过命令行参数控制截图行为:
# 禁用所有截图
pytest --disable-screenshots
# 失败时才截图
pytest --screenshot-on-failure
# 为所有测试添加唯一标识前缀
pytest --screenshot-prefix=smoke_test_
SeleniumBase录屏方案
录屏功能概述
SeleniumBase本身未提供内置视频录制功能,但通过与第三方工具集成,可实现测试过程的视频捕获。主要有以下两种方案:
- 浏览器驱动录屏:通过Chrome/Firefox的内置功能录制视频
- 桌面录屏工具:使用系统级录屏软件捕获浏览器窗口
方案一:基于Chrome DevTools Protocol的录屏
Chrome浏览器提供了通过DevTools Protocol录制视频的能力,可与SeleniumBase结合使用:
from seleniumbase import BaseCase
import json
class CDPVideoRecordingTest(BaseCase):
def test_cdp_video_recording(self):
# 启动Chrome并启用CDP
self.start_recording_cdp_video()
# 执行测试步骤
self.open("https://seleniumbase.io/demo_page")
self.click("#myButton")
self.type("#myInput", "测试视频录制")
# 停止录制并保存
video_path = self.stop_recording_cdp_video("demo_recording")
self.assert_true(os.path.exists(video_path))
print(f"视频已保存至: {video_path}")
def start_recording_cdp_video(self):
# 启用CDP视频录制
self.driver.execute_cdp_cmd("Page.startScreencast", {
"format": "webm",
"quality": 80,
"maxWidth": 1280,
"maxHeight": 720,
"everyNthFrame": 1
})
self.video_frames = []
self.driver.add_cdp_listener("Page.screencastFrame", self._save_frame)
def _save_frame(self, frame):
# 保存视频帧数据
self.video_frames.append(frame["data"])
def stop_recording_cdp_video(self, name):
# 停止录制并合并帧数据
self.driver.execute_cdp_cmd("Page.stopScreencast", {})
video_data = b"".join(self.video_frames)
video_path = f"./videos/{name}.webm"
os.makedirs(os.path.dirname(video_path), exist_ok=True)
with open(video_path, "wb") as f:
f.write(video_data)
return video_path
优缺点分析:
- ✅ 优点:无需额外软件,直接通过浏览器API录制,资源占用低
- ❌ 缺点:仅支持Chrome浏览器,视频格式固定为webm,需要手动处理帧数据
方案二:使用ffmpeg进行桌面录屏
对于跨浏览器的录屏需求,可使用ffmpeg工具捕获整个浏览器窗口:
import subprocess
import time
import os
from seleniumbase import BaseCase
class FFmpegVideoRecordingTest(BaseCase):
def test_ffmpeg_video_recording(self):
# 获取浏览器窗口信息
window_rect = self.driver.get_window_rect()
x, y, width, height = window_rect["x"], window_rect["y"], window_rect["width"], window_rect["height"]
# 启动ffmpeg录制
video_path = "./videos/ffmpeg_recording.mp4"
ffmpeg_cmd = (
f"ffmpeg -y -f x11grab -video_size {width}x{height} "
f"-i :0.0+{x},{y} -c:v libx264 -crf 25 {video_path}"
)
self.process = subprocess.Popen(ffmpeg_cmd, shell=True)
# 执行测试步骤
self.open("https://seleniumbase.io/demo_page")
# ... 其他测试操作 ...
# 停止录制
self.process.terminate()
self.assert_true(os.path.exists(video_path))
前置要求:
- 安装ffmpeg:
sudo apt install ffmpeg(Linux) 或brew install ffmpeg(Mac) - 确保测试以非无头模式运行:
pytest --headless=0
优缺点分析:
- ✅ 优点:支持所有浏览器,可自定义视频格式和质量,录制整个测试过程
- ❌ 缺点:需要额外安装软件,资源占用较高,需要手动处理窗口定位
方案三:使用pytest-movie插件
pytest-movie是一个第三方插件,可与SeleniumBase无缝集成:
# 安装插件
pip install pytest-movie
# 运行测试并录制视频
pytest test_demo.py --movie=./videos/ --format=mp4
该插件会自动检测浏览器窗口并录制视频,支持多种格式和分辨率设置。在SeleniumBase测试中无需额外代码,通过命令行参数即可启用。
测试证据管理最佳实践
截图策略设计
有效的截图策略可以在不占用过多存储空间的前提下,提供充分的测试证据:
def test_optimized_screenshot_strategy(self):
try:
self.open("https://seleniumbase.io/demo_page")
# 关键步骤主动截图
self.save_screenshot("step1_initial_load.png")
self.click("#interactiveElement")
# 状态变更时截图
self.save_screenshot("step2_after_click.png")
# 验证结果
self.assert_element("#resultSuccess")
# 仅在验证通过时保存成功截图
self.save_screenshot("step3_verification_success.png")
except Exception as e:
# 失败时捕获详细上下文
self.save_screenshot("failure_details.png")
self.save_page_source("failure_page_source.html")
raise e
证据组织与命名规范
推荐的证据文件命名规范:
YYYYMMDD_HHMMSS_[TESTCASE]_[STEP]_[STATUS].ext
示例实现:
def get_timestamped_filename(test_name, step_name, status="info"):
timestamp = time.strftime("%Y%m%d_%H%M%S")
return f"{timestamp}_{test_name}_{step_name}_{status}.png"
# 使用示例
screenshot_name = get_timestamped_filename("login_test", "enter_credentials", "info")
self.save_screenshot(screenshot_name, folder="./evidence")
集成测试报告
SeleniumBase可与Allure报告集成,自动将截图附加到测试报告中:
# 安装allure-pytest
pip install allure-pytest
# 运行测试并生成报告
pytest --alluredir=./allure_results
# 查看报告
allure serve ./allure_results
在测试代码中添加截图注解:
import allure
def test_with_allure_integration(self):
self.open("https://seleniumbase.io/demo_page")
screenshot = self.save_screenshot_to_logs()
allure.attach.file(screenshot, name="demo_page", attachment_type=allure.attachment_type.PNG)
常见问题与解决方案
截图模糊或分辨率不足
# 解决方法:设置浏览器窗口大小
def test_high_resolution_screenshot(self):
# 设置固定窗口大小
self.set_window_size(1920, 1080)
self.open("https://seleniumbase.io/demo_page")
self.save_screenshot("high_res_screenshot.png")
# 或使用最大化窗口
self.maximize_window()
self.save_screenshot("max_window_screenshot.png")
录屏文件过大
优化ffmpeg录制参数:
# 降低分辨率和比特率
ffmpeg -y -f x11grab -video_size 1280x720 -i :0.0 -c:v libx264 -crf 30 -preset veryfast small_file.mp4
测试失败时未捕获截图
确保在pytest配置中启用失败自动截图:
# pytest.ini
[pytest]
addopts = --screenshot-on-failure
总结与展望
SeleniumBase提供了强大而灵活的截图功能,可满足各种测试证据收集需求。对于录屏功能,虽然框架本身未内置,但通过CDP API、ffmpeg或第三方插件等方式,可实现全面的测试过程记录。
随着测试自动化的发展,未来可能会看到:
- SeleniumBase内置视频录制功能
- AI辅助的智能截图(自动识别关键步骤)
- 与测试管理系统的深度集成
掌握本文介绍的截图和录屏技巧,将帮助你构建更可靠、可维护的测试自动化体系,为测试结果提供充分的视觉证据,加速问题定位和修复过程。
记住,有效的测试证据不仅是测试结果的记录,更是团队协作和持续改进的重要依据。通过合理的策略和工具选择,可以在效率和质量之间取得最佳平衡。
最后,建议定期回顾和优化你的证据收集策略,确保它能适应项目的发展和变化。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



