Python Playwright追踪功能封装:打造高效、自动化的测试装饰器

playwright框架介绍

一、概述

Playwright是一个由Microsoft开发的强大且灵活的浏览器自动化库,它支持Chromium(Chrome)、Firefox和WebKit(Safari)等主流浏览器。Playwright允许您使用Python(以及其他编程语言)编写脚本,以模拟用户与网页的交互,实现自动化测试、数据抓取、UI验证等多种功能。

二、核心特点

  1. 跨浏览器支持:Playwright原生支持Chrome、Firefox和WebKit浏览器,使得测试能够在不同浏览器环境中进行,确保兼容性。

  2. 跨平台支持:Playwright可以在Windows、Mac和Linux等操作系统上运行,方便开发者在不同环境中进行测试。

  3. 易于使用:Playwright提供了简洁明了的API,使得开发者能够快速地编写自动化脚本。

  4. 自动等待:Playwright在执行操作时会自动等待元素加载和可交互,减少显式等待的需要,提高了脚本的健壮性。

  5. 丰富的调试功能:Playwright支持屏幕截图、页面PDF导出、视频录制等功能,有助于问题排查和结果分析。

  6. 并发执行:Playwright支持在同一台机器上并发执行多个浏览器实例,提高了测试效率。

  7. 无头模式:Playwright支持无头模式(即无GUI模式),适合在服务器或持续集成环境中运行。

  8. 上下文隔离:Playwright为每个浏览器上下文提供独立的会话,避免了不同测试之间的干扰。

三、安装与配置

使用Python和Playwright,您需要首先安装Python和pip。然后,通过pip安装Playwright:

pip install playwright

安装完成后,您可以使用playwright install命令下载浏览器驱动。

四、实践应用

以下是一个简单的Python示例,展示如何使用Playwright打开一个网页并截图:

from playwright import sync_playwright  
  
with sync_playwright() as p:  
    browser = p.chromium.launch()  # 也可以使用firefox.launch()或webkit.launch()  
    context = browser.new_context()  
    page = context.new_page()  
    page.goto("https://example.com")  
    page.screenshot(path="screenshot.png")  # 截图保存为screenshot.png  
    browser.close()

在实际应用中,您可以根据需求编写更复杂的脚本,如模拟用户登录、表单填写、点击按钮、验证页面元素等。Playwright还提供了丰富的API来支持这些操作。

录制功能

上面是对playwright的大致讲解,如果是初学者,可以在网上搜一下playwright的基础使用,本文主要是对playwright的录制功能做一下封装,封装成一个装饰器,方便代码扩展,尤其对于测试人员来说,有了这个装饰器,我们只需要关注测试用例的逻辑编写,简化了代码编写量。

废话不多说,直接上代码:

import asyncio
from functools import wraps
from playwright.async_api import async_playwright
from playwright.sync_api import sync_playwright

def trace_decorator(path, screenshots=True, snapshots=True, sources=True):
    def decorator(func):
        # 检查func是同步还是异步函数,以选择正确的包装方式
        if asyncio.iscoroutinefunction(func):
            @wraps(func)
            async def wrapper(*args, **kwargs):
                async with async_playwright() as playwright:
                    browser = await playwright.chromium.launch(headless=False)
                    context = await browser.new_context()
                    try:
                        # 开始追踪
                        await context.tracing.start(screenshots=screenshots, snapshots=snapshots, sources=sources)
                        page = await context.new_page()
                        await func(page, *args, **kwargs)
                    except Exception as e:
                        print(f"测试中发生异常:{e}")
                    finally:
                        # 停止追踪
                        await context.tracing.stop(path=path)

            return wrapper
        else:
            @wraps(func)
            def wrapper(*args, **kwargs):
                with sync_playwright() as playwright:
                    browser = playwright.chromium.launch(headless=False)
                    context = browser.new_context()
                    try:
                        # 开始追踪
                        context.tracing.start(screenshots=screenshots, snapshots=snapshots, sources=sources)
                        page = context.new_page()
                        # 在这里可以添加其他的初始化代码,比如设置视口大小等
                        func(page, *args, **kwargs)  # 直接传递 page 参数给测试函数
                    except Exception as e:
                        print(f"测试中发生异常:{e}")
                    finally:
                        # 停止追踪
                        context.tracing.stop(path=path)

            return wrapper

    return decorator


# 使用方式

@trace_decorator(path="traces/qtrade_test.zip")  # 填写对应的录制后保存的地址
def run(page: Page):
    # 这里是测试逻辑
    pass

run()  # 直接调用run函数,不需要再创建浏览器实例,创建浏览器上下文,创建新页面,本身装饰器中就实现了,当然了,在装饰器中,你还可以添加其它的初始化代码,比如设置视口大小等

这段代码定义了一个名为 trace_decorator 的装饰器工厂函数,它用于创建一个装饰器,该装饰器可以包装另一个函数(通常是一个用于网页测试的函数),以便在执行该函数时记录浏览器的追踪信息(如截图、页面快照和源代码)。以下是这段代码的详细解析:

  1. 定义装饰器工厂函数 trace_decorator

    • 这个函数接受四个参数:path(追踪文件保存的路径)、screenshots(是否记录截图)、snapshots(是否记录页面快照)和 sources(是否记录页面源代码)。
    • 它返回一个装饰器函数 decorator
  2. 定义装饰器函数 decorator

    • 这个函数接受一个待装饰的函数 func 作为参数。
    • 装饰器函数检查 func 是否是异步函数(使用 asyncio.iscoroutinefunction)。
  3. 异步函数的装饰

    • 如果 func 是异步函数,装饰器会定义一个异步的 wrapper 函数。
    • 在 wrapper 函数中,首先使用 async_playwright()启动一个Playwright实例。
    • 接着,启动一个Chromium浏览器实例,并创建一个新的浏览器上下文。
    • 使用 context.tracing.start 开始追踪,并设置截图、快照和源代码的捕获选项。
    • 创建一个新的页面,并调用原始的 func 函数,将页面对象作为参数传递。
    • 如果在测试过程中发生异常,将打印异常信息。
    • 无论测试是否成功,都会使用 context.tracing.stop 停止追踪,并将追踪信息保存到指定的路径。
  4. 同步函数的装饰

    • 如果 func 不是异步函数,装饰器会定义一个普通的 wrapper 函数。
    • 在 wrapper 函数中,首先使用 async_playwright()启动一个Playwright实例。
    • 在同步的 wrapper 函数中,它直接启动浏览器、创建上下文,并开始追踪。
    • 调用原始的 func 函数,并直接传递页面对象。
    • 类似于异步版本,同步版本的 wrapper 也会在测试完成后停止追踪。
  5. 返回装饰器

    • 最后,装饰器工厂函数 trace_decorator 返回装饰器函数 decorator,这样它就可以被应用到其他函数上。

猜你喜欢

转载自blog.csdn.net/judahwang/article/details/139867603