Playwright Python教程:基础篇
文章目录
- **目标读者**
- **一、Playwright 是什么?为什么选择它?**
- **二、核心概念:Browser, Context, Page**
- **三、环境安装与 setup**
- **四、第一个示例脚本:打开网页并截图**
- **五、基本交互:点击与输入**
- **六、定位元素与选择器**
- **七、断言:验证结果**
- **基础篇总结与下一步**
目标读者
本教程面向从未接触过 Playwright 或刚刚起步的自动化测试开发者。我们将从最核心的概念讲起,确保你能牢固地打下基础。
一、Playwright 是什么?为什么选择它?
1. 是什么?
Playwright 是一个用于 Web 测试和自动化的开源库。它提供了一个高级 API 来控制 Chromium、Firefox 和 WebKit 浏览器,让你能够以编程方式模拟用户操作,如点击、输入、导航等,从而进行自动化测试或网页抓取。
2. 为什么选择它?(对比 Selenium)
- 跨浏览器支持:原生支持所有现代浏览器,包括 WebKit(Safari 的引擎)。
- 速度快、更可靠:自动等待元素出现、网络请求完成等,减少了编写
time.sleep()
的需要,测试更加稳定。 - 强大的自动化能力:可以模拟移动设备、地理定位、权限等复杂场景;轻松处理 iframe 和多个页面(Tab)。
- 自动录制工具:内置代码生成器,可以录制你的操作并生成对应代码,对初学者极其友好。
特性 | Playwright | Selenium | 优势方 |
---|---|---|---|
架构与速度 | WebSocket,速度快 | HTTP,速度慢 | Playwright |
自动等待 | 内置智能等待,稳定 | 需大量编写显式等待,脆弱 | Playwright |
选择器引擎 | 强大(文本、CSS、React/Vue) | 标准(CSS, XPath) | Playwright |
多会话支持 | Browser Context,轻量隔离 | 需启动多实例,重量级 | Playwright |
网络控制 | 强大,可拦截、Mock、修改 | 非常有限 | Playwright |
移动端测试 | 优秀模拟(设备、视口、触摸) | 依赖 Appium,配置复杂 | Playwright (模拟) |
录制功能 | 内置,生成代码质量高 | 依赖 IDE,代码质量一般 | Playwright |
学习曲线 | 低至中,API 设计现代 | 中,概念较多且旧 | Playwright |
社区与生态 | 快速增长,但较新 | 极其庞大和成熟,资源丰富 | Selenium |
语言支持 | JS/TS, Python, Java, .NET | 几乎所有语言 | Selenium |
云服务集成 | 所有主流云服务均支持 | 所有云服务都原生支持 | 平手 |
二、核心概念:Browser, Context, Page
理解这三个核心概念是学好 Playwright 的关键。它们的关系就像浏览器 -> 用户会话 -> 标签页。
-
Browser:
- 代表一个浏览器实例。你可以把它想象成你电脑上安装的 Chrome 或 Firefox 程序。
- 通常由一个
browser_type
(如chromium
)启动。启动它是比较耗资源的操作。
-
Context:
- 浏览器上下文。这是一个非常重要的概念,它类似于一个独立的匿名会话窗口(Incognito Window)。
- 每个 Context 相互隔离,它们之间不共享 cookies、缓存和本地存储。这非常有用,你可以用它来模拟多个用户同时登录同一个网站。
- 一个 Browser 可以创建多个 Context。
-
Page:
- 代表一个标签页(Tab)或一个弹出窗口。
- 你的大部分操作(如点击链接、填写表单)都将在一个 Page 上完成。
- 一个 Context 可以拥有多个 Page。
关系总结:
一个 Browser -> 多个 Context -> 多个 Page
三、环境安装与 setup
-
安装 Playwright Python 库:
pip install pytest-playwright
推荐使用
pytest-playwright
,它包含了运行测试所需的库。 -
安装浏览器驱动(Chromium, Firefox, WebKit):
playwright install
这条命令会下载所有支持的浏览器,以便 Playwright 可以使用它们。
四、第一个示例脚本:打开网页并截图
让我们编写一个最简单的脚本,感受一下 Playwright 的工作流程。
# 1. 导入同步的 Playwright API
from playwright.sync_api import sync_playwright# 2. 使用 sync_playwright 管理器
with sync_playwright() as p:# 3. 启动一个 Chromium 浏览器实例 (headless 模式,即无界面)browser = p.chromium.launch(headless=False) # 设置为 False 可以看到浏览器操作# 4. 创建一个浏览器上下文context = browser.new_context()# 5. 在上下文中创建一个新的页面/标签页page = context.new_page()# 6. 让页面导航到指定的 URLpage.goto('https://example.com')# 7. 对页面进行截图并保存page.screenshot(path='example.png')# 8. 打印当前页面的标题print(page.title())# 9. 关闭浏览器browser.close()
逐行解释:
- 导入同步模式的 API。Playwright 也支持异步(
async_api
),但同步模式对初学者更友好。 sync_playwright()
是一个上下文管理器,它负责启动和停止 Playwright。- 使用
chromium
浏览器类型来启动浏览器。launch(headless=False)
表示以有界面模式启动,方便调试。默认是True
(无头模式)。 - 创建一个新的、独立的浏览器上下文。
- 在上下文中创建一个新的页面(就像打开了一个新标签页)。
- 命令页面跳转到
https://example.com
。 - 对当前页面进行截图,并保存为
example.png
。 - 在控制台打印页面的标题(
<title>
标签的内容)。 - 最后,关闭浏览器,释放资源。
运行这个脚本,你会看到浏览器打开,访问 example.com,然后自动关闭,并在你的项目目录下生成一张 example.png
的截图。
五、基本交互:点击与输入
自动化测试的核心是模拟用户交互。最常见的就是点击和输入文本。
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)context = browser.new_context()page = context.new_page()# 导航到 Playwright 官方文档搜索页page.goto('https://playwright.dev/python/docs/intro')# 1. 点击搜索框# 使用 CSS 选择器 ‘.DocSearch-Button’ 来定位元素page.click('.DocSearch-Button')# 2. 在搜索框中输入文本 ‘python’# 使用 CSS 选择器 ‘.DocSearch-Input’ 来定位元素page.fill('.DocSearch-Input', 'python')# 为了演示,我们等待一下,然后截图看看效果page.wait_for_timeout(3000) # 等待 3 秒(单位:毫秒)page.screenshot(path='search.png')browser.close()
page.click(selector)
:点击一个元素。你需要提供一个 选择器(如 CSS 选择器)来告诉 Playwright 要点击哪个元素。page.fill(selector, value)
:在输入框内填充文本。它会先清空输入框,再输入文本。page.wait_for_timeout(timeout)
:强制等待指定的毫秒数。应尽量避免使用,最好用page.wait_for_selector
或其他智能等待方法。这里只是为了演示暂停。
六、定位元素与选择器
要与元素交互,首先必须找到它。Playwright 支持多种选择器:
- CSS 选择器:最常用,如
button.submit
,#login-btn
。 - 文本选择器:通过文本内容定位,如
page.click(‘text=Login’)
。 - XPath:
page.click(‘//button’)
。
最佳实践:使用录制工具生成选择器
对于初学者,手动写选择器可能很困难。Playwright 内置了代码生成器,可以帮你!
- 在终端运行:
playwright codegen https://example.com
- 这会打开一个浏览器和一个代码录制窗口。
- 你在浏览器里的所有操作都会被实时转换成代码,并显示在窗口中。
- 你可以直接复制这些代码到你的脚本中使用。
七、断言:验证结果
测试离不开断言。Playwright 推荐使用 Python 标准的 assert
语句,因为它简单直接。
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch(headless=False)page = browser.new_page() # 简便写法,相当于 new_context().new_page()page.goto('https://example.com')# 断言:页面的标题是 ‘Example Domain’assert page.title() == 'Example Domain'# 定位一个元素(<h1>标签),并断言其文本内容heading_element = page.query_selector('h1')assert heading_elementassert heading_element.text_content() == 'Example Domain'print(‘测试通过!’)browser.close()
page.title()
:获取页面标题。page.query_selector(selector)
:查找一个匹配选择器的元素,返回ElementHandle
对象,如果没找到则返回None
。element.text_content()
:获取元素的文本内容。
基础篇总结与下一步
恭喜!你已经掌握了 Playwright 最基础也是最重要的概念:
- 理解了 Browser, Context, Page 的关系。
- 学会了如何搭建环境和编写第一个脚本。
- 学会了基本交互:
goto
,click
,fill
。 - 知道了如何用选择器定位元素和用
assert
进行验证。 - 知道了
playwright codegen
这个强大的录制工具。
下一步(中级篇预览):
在中级篇中,我们将深入更实用的主题:
- 高级等待策略:
page.wait_for_selector
,page.wait_for_function
,告别time.sleep
。 - 处理下拉框、对话框(Alert)、文件上传等复杂组件。
- 处理 Frame 和 Iframe。
- 管理多个 Page 和 Tab。
- 模拟键盘和鼠标高级事件。