SeleniumBase截图与录屏功能:测试证据收集完全指南

SeleniumBase截图与录屏功能:测试证据收集完全指南

【免费下载链接】SeleniumBase seleniumbase/SeleniumBase: 一个 Python 库,用于自动化 Web 应用程序测试。特点是提供了一个简单易用的 API,可以用于模拟用户操作,包括点击、输入和滚动等。 【免费下载链接】SeleniumBase 项目地址: https://gitcode.com/GitHub_Trending/se/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本身未提供内置视频录制功能,但通过与第三方工具集成,可实现测试过程的视频捕获。主要有以下两种方案:

  1. 浏览器驱动录屏:通过Chrome/Firefox的内置功能录制视频
  2. 桌面录屏工具:使用系统级录屏软件捕获浏览器窗口

方案一:基于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))

前置要求

  1. 安装ffmpeg:sudo apt install ffmpeg (Linux) 或 brew install ffmpeg (Mac)
  2. 确保测试以非无头模式运行: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或第三方插件等方式,可实现全面的测试过程记录。

随着测试自动化的发展,未来可能会看到:

  1. SeleniumBase内置视频录制功能
  2. AI辅助的智能截图(自动识别关键步骤)
  3. 与测试管理系统的深度集成

掌握本文介绍的截图和录屏技巧,将帮助你构建更可靠、可维护的测试自动化体系,为测试结果提供充分的视觉证据,加速问题定位和修复过程。

记住,有效的测试证据不仅是测试结果的记录,更是团队协作和持续改进的重要依据。通过合理的策略和工具选择,可以在效率和质量之间取得最佳平衡。

最后,建议定期回顾和优化你的证据收集策略,确保它能适应项目的发展和变化。

【免费下载链接】SeleniumBase seleniumbase/SeleniumBase: 一个 Python 库,用于自动化 Web 应用程序测试。特点是提供了一个简单易用的 API,可以用于模拟用户操作,包括点击、输入和滚动等。 【免费下载链接】SeleniumBase 项目地址: https://gitcode.com/GitHub_Trending/se/SeleniumBase

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值