首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Web 测试和自动化框架 Playwright

Web 测试和自动化框架 Playwright

作者头像
YaoQi
发布2025-11-13 17:45:32
发布2025-11-13 17:45:32
1820
举报

Playwright 是由微软(Microsoft)开源的一个现代化 Web 自动化测试框架,支持多浏览器(Chromium, WebKit, Firefox)、多语言(TypeScript, JavaScript, Python, .NET),适用于端到端(E2E)测试、爬虫、自动化操作等场景。

Playwright 作为一款较新的自动化测试工具,在架构、性能、易用性和稳定性等多个方面都展现出了比 Selenium 更现代的优势。

Playwright 的许多设计细节极大地提升了开发效率:

  • 智能等待系统:Playwright 在执行点击、输入等操作前,会自动等待元素变得可见、稳定、可操作。这基本消除了编写繁琐的time.sleep或显式等待代码的需要,从源头上减少了因页面加载时间不确定而导致的测试失败。
  • 更精准灵活的元素定位器:Playwright 提供了一套强大的选择器引擎,支持通过文本内容、CSS 等多种方式组合定位元素,甚至可以直接定位 React 或 Vue 组件,让定位器更易写且更健壮
  • 可以直接测试 API 接口:有时您可能希望直接从 Python 向服务器发送请求,而无需加载页面在其中运行 js 代码。
  • Mock API:页面执行的任何请求,包括 XHR 和 fetch 请求,都可以被跟踪、修改和模拟
  • 保存登录信息:您可能会在文件系统上存储经过身份验证的浏览器状态,这样就不用每次都重复登录了。
  • 快速安装测试用浏览器:每个版本的 Playwright 都需要特定版本的浏览器二进制文件才能运行。您可以使用 Playwright CLI 来安装这些浏览器。
  • 操控时间:为了测试时间相关的功能,可以设置时间,快进时间等。
  • 处理文件下载:对于页面下载的每个附件,都会发出 page.on(“download”) 事件。
  • 设备仿真:您可以在任何浏览器上测试您的应用程序,也可以模拟真实设备,例如手机或平板电脑。
  • 运行JS代码:page.evaluate() API 可以在网页上下文中运行 JavaScript 函数,并将结果带回 Playwright 环境。

安装

代码语言:javascript
复制
pip install --upgrade pip # 升级pip
pip install playwright # 安装playwright
playwright install # 安装自带浏览器,非必须,但对环境不熟悉的也推荐
                   # playwright -h 查看用法

示例:打开网页获取title

代码语言:javascript
复制
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(channel="chrome", headless=False)
    page = browser.new_page()
    page.goto("https://playwright.dev")
    print(page.title())
    browser.close()

注:如果不带channel参数,则会提示:

代码语言:javascript
复制
这就需要执行playwright install安装浏览器(不会覆盖系统浏览器)
代码语言:javascript
复制
channel="chrome" 则会使用系统已安装的浏览器。
代码语言:javascript
复制
executable_path="chrome-win64\\chrome.exe"则可以指定浏览器可执行文件的路径。
代码语言:javascript
复制
代码语言:javascript
复制
也支持协程异步API:
代码语言:javascript
复制
import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        page = await browser.new_page()
        await page.goto("https://playwright.dev")
        print(await page.title())
        await browser.close()

asyncio.run(main())
代码语言:javascript
复制
代码语言:javascript
复制
测试生成器 Test generator

Playwright 自带一个 codegen 命令,运行 codegen 命令时,将打开两个窗口:一个是浏览器窗口,用于与要测试的网站进行交互;另一个是 Playwright 检查器窗口,用于记录测试结果,然后可以复制代码到编辑器中。这种方式对我们定位元素,执行操作,帮助极大。

代码语言:javascript
复制
playwright codegen --channel chrome

注:--channel chrome 参数可以打开系统浏览器,否则就要安装Playwright自带浏览器了,没有发现可以配置浏览器路径的参数。

注意选择目标代码:

定位元素

推荐的定位器:

代码语言:javascript
复制
page.get_by_role() 按元素的 ARIA 角色、ARIA 属性和可访问名称定位元素。
page.get_by_text() 按文本内容定位。
page.get_by_label() 按关联标签的文本查找表单控件
page.get_by_placeholder() 按占位符定位输入框.
page.get_by_alt_text() 通过文本替代项来定位元素(通常是图像)
page.get_by_title() 按元素的标题属性定位元素
page.get_by_test_id() 根据元素的 data-testid 属性定位元素(可以配置其他属性)。

注:ARIA 是 Accessible Rich Internet Applications 的缩写,它是一组属性,用于使 Web 内容和 Web 应用程序(特别是那些使用 Ajax 和 JavaScript 开发的)更易于残障人士访问。

传统的定位器:

代码语言:javascript
复制
page.locator("#nav-bar :text('Home')").click()  CSS定位
page.locator("xpath=//button").click() XPath定位
page.locator("button").locator("nth=0").click()  第N个定位
page.get_by_role("listitem").filter(has=child)  父子元素定位,child是一个locator

还有其他一些定位器,详见文档。

执行操作

代码语言:javascript
复制
page.get_by_role("textbox").fill("Peter") 文本输入
page.locator('#area').press_sequentially('Hello World!') 逐个输入
page.get_by_label('XL').check()   选中选项,单选框,复选框
page.get_by_label('Choose a color').select_option('blue') 选中列表选项
page.get_by_role("textbox").press("Control+ArrowRight")  键盘按键
page.get_by_label("Upload file").set_input_files('myfile.pdf') 上传文件
page.get_by_label('password').focus() 选中元素
page.locator("#item-to-be-dragged").drag_to(page.locator("#item-to-drop-at")) 拖拽
page.get_by_text("Footer text").scroll_into_view_if_needed() 滚动条

鼠标操作

代码语言:javascript
复制
# 普通的单击
page.get_by_role("button").click()
# 双击
page.get_by_text("Item").dblclick()
# 右击
page.get_by_text("Item").click(button="right")
# 按住 Shift 单击
page.get_by_text("Item").click(modifiers=["Shift"])
# 鼠标悬停
page.get_by_text("Item").hover()
# 点击左上角
page.get_by_text("Item").click(position={ "x": 0, "y": 0})
# 按下鼠标
page.mouse.down() 
# 抬起鼠标
page.mouse.up()
# 滚轮
page.mouse.wheel(5, 5)

好了,就介绍到这里了。更多详细的内容,请参考官方文档:

  • 官网:https://playwright.dev/
  • GitHub:https://github.com/microsoft/playwright
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漫跑的小兔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档