playwright框架介绍
一、概述
Playwright是一个由Microsoft开发的强大且灵活的浏览器自动化库,它支持Chromium(Chrome)、Firefox和WebKit(Safari)等主流浏览器。Playwright允许您使用Python(以及其他编程语言)编写脚本,以模拟用户与网页的交互,实现自动化测试、数据抓取、UI验证等多种功能。
二、核心特点
-
跨浏览器支持:Playwright原生支持Chrome、Firefox和WebKit浏览器,使得测试能够在不同浏览器环境中进行,确保兼容性。
-
跨平台支持:Playwright可以在Windows、Mac和Linux等操作系统上运行,方便开发者在不同环境中进行测试。
-
易于使用:Playwright提供了简洁明了的API,使得开发者能够快速地编写自动化脚本。
-
自动等待:Playwright在执行操作时会自动等待元素加载和可交互,减少显式等待的需要,提高了脚本的健壮性。
-
丰富的调试功能:Playwright支持屏幕截图、页面PDF导出、视频录制等功能,有助于问题排查和结果分析。
-
并发执行:Playwright支持在同一台机器上并发执行多个浏览器实例,提高了测试效率。
-
无头模式:Playwright支持无头模式(即无GUI模式),适合在服务器或持续集成环境中运行。
-
上下文隔离: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
的装饰器工厂函数,它用于创建一个装饰器,该装饰器可以包装另一个函数(通常是一个用于网页测试的函数),以便在执行该函数时记录浏览器的追踪信息(如截图、页面快照和源代码)。以下是这段代码的详细解析:
-
定义装饰器工厂函数
trace_decorator
:- 这个函数接受四个参数:
path
(追踪文件保存的路径)、screenshots
(是否记录截图)、snapshots
(是否记录页面快照)和sources
(是否记录页面源代码)。 - 它返回一个装饰器函数
decorator
。
- 这个函数接受四个参数:
-
定义装饰器函数
decorator
:- 这个函数接受一个待装饰的函数
func
作为参数。 - 装饰器函数检查
func
是否是异步函数(使用asyncio.iscoroutinefunction
)。
- 这个函数接受一个待装饰的函数
-
异步函数的装饰:
- 如果
func
是异步函数,装饰器会定义一个异步的wrapper
函数。 - 在
wrapper
函数中,首先使用async_playwright()
启动一个Playwright实例。 - 接着,启动一个Chromium浏览器实例,并创建一个新的浏览器上下文。
- 使用
context.tracing.start
开始追踪,并设置截图、快照和源代码的捕获选项。 - 创建一个新的页面,并调用原始的
func
函数,将页面对象作为参数传递。 - 如果在测试过程中发生异常,将打印异常信息。
- 无论测试是否成功,都会使用
context.tracing.stop
停止追踪,并将追踪信息保存到指定的路径。
- 如果
-
同步函数的装饰:
- 如果
func
不是异步函数,装饰器会定义一个普通的wrapper
函数。 - 在
wrapper
函数中,首先使用async_playwright()
启动一个Playwright实例。 - 在同步的
wrapper
函数中,它直接启动浏览器、创建上下文,并开始追踪。 - 调用原始的
func
函数,并直接传递页面对象。 - 类似于异步版本,同步版本的
wrapper
也会在测试完成后停止追踪。
- 如果
-
返回装饰器:
- 最后,装饰器工厂函数
trace_decorator
返回装饰器函数decorator
,这样它就可以被应用到其他函数上。
- 最后,装饰器工厂函数