一文掌握 Playwright 的详细使用
文章目录
- 1. 安装 Playwright
- 1.1 安装 Playwright 库
- 1.2 安装浏览器
- 2. 基础用法
- 2.1 启动浏览器
- 2.2 查找元素
- 2.3 操作元素
- 3. 高级功能
- 3.1 等待机制
- 3.2 处理弹窗
- 3.3 执行 JavaScript
- 3.4 切换 iframe
- 3.5 处理 Cookies
- 3.6 截图和 PDF
- 3.7 模拟设备
- 3.8 网络拦截
- 4. 常见应用场景
- 4.1 自动化登录
- 4.2 抓取动态加载数据
- 4.3 模拟下拉菜单选择
- 5. 异步支持
- 6. 测试框架集成
- 7. 调试技巧
- 7.1 慢动作模式
- 7.2 调试日志
- 8. 总结
Playwright 是一个现代化的浏览器自动化工具,支持 Chromium、Firefox 和 WebKit 浏览器。它提供了强大的 API,适用于网页自动化测试、数据抓取和网页交互。Playwright 支持多语言(如 Python、JavaScript、Java、C# 等),并且具有跨浏览器、跨平台的特性。
官网:https://playwright.dev/python/docs/intro
github:https://github.com/microsoft/playwright
本文将详细介绍 Playwright 的安装、基础用法和高级功能。
1. 安装 Playwright
1.1 安装 Playwright 库
使用 pip 安装 Playwright:pip install playwright
1.2 安装浏览器
安装 Playwright 后,需要下载支持的浏览器:playwright install
2. 基础用法
2.1 启动浏览器
Playwright 支持多种浏览器,包括 Chromium、Firefox 和 WebKit。以下是一个简单的示例,启动浏览器并打开网页:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 启动浏览器
browser = p.chromium.launch(headless=False) # headless=False 表示显示浏览器窗口
# 打开新页面
page = browser.new_page()
# 访问网页
page.goto('https://www.example.com')
# 截图
page.screenshot(path='example.png')
# 关闭浏览器
browser.close()
2.2 查找元素
Playwright 提供了多种查找元素的方法:
page.query_selector()
:查找单个元素。page.query_selector_all()
:查找所有匹配的元素。page.locator()
:通过选择器定位元素。
示例:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto('https://www.example.com')
# 通过选择器查找元素
element = page.query_selector('h1')
text = element.inner_text()
print(text) # 输出元素的文本内容
browser.close()
2.3 操作元素
输入文本
# 输入文本:page.fill(selector, text)
page.fill('#input-id', 'Hello, Playwright')
点击元素
# 点击元素:page.click(selector)
page.click('#submit-button')
获取元素属性
value = page.get_attribute('#element-id', 'value')
获取元素文本
# 获取元素文本:page.text_content(selector)
text = page.inner_text('#element-id')
3. 高级功能
3.1 等待机制
Playwright 提供了多种等待机制,用于处理页面加载或元素加载的延迟。
等待元素出现
# 等待元素出现:page.wait_for_selector(selector)
page.wait_for_selector('#element-id', timeout=5000) # 等待最多 5 秒
等待导航完成
page.goto('https://www.example.com', wait_until='networkidle') # 等待网络空闲
自定义等待
page.wait_for_timeout(2000) # 等待 2 秒
3.2 处理弹窗
Playwright 可以处理浏览器的弹窗(如警告框、确认框、提示框)。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 监听弹窗事件
page.on('dialog', lambda dialog: dialog.accept()) # 点击确定
page.goto('https://example.com')
page.click('button') # 点击按钮触发弹窗
browser.close()
3.3 执行 JavaScript
可以通过 page.evaluate() 方法执行 JavaScript 代码。
# 滚动页面到底部
page.evaluate('window.scrollTo(0, document.body.scrollHeight);')
# 修改元素属性
page.evaluate('document.getElementById("element-id").style.backgroundColor = "yellow";')
3.4 切换 iframe
如果需要操作 iframe 中的元素,需要先切换到 iframe。
frame = page.frame(name='iframe-name')
element = frame.query_selector('#element-in-iframe')
3.5 处理 Cookies
Playwright 可以操作浏览器的 Cookies。
# 设置 Cookie
page.context.add_cookies([{'name': 'key', 'value': 'value', 'url': 'https://www.example.com'}])
# 获取 Cookie
cookies = page.context.cookies()
print(cookies)
# 删除 Cookie
page.context.clear_cookies()
3.6 截图和 PDF
截图
page.screenshot(path='screenshot.png', full_page=True) # 截取整个页面
生成 PDF
page.pdf(path='page.pdf', format='A4')
示例:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://example.com')
# 截取页面截图
page.screenshot(path='example.png')
# 生成 PDF 文件
page.pdf(path='example.pdf')
browser.close()
3.7 模拟设备
Playwright 可以模拟不同的设备(如 iPhone、iPad 等)来测试响应式设计。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
iPhone = p.devices['iPhone 11']
context = browser.new_context(**iPhone)
page = context.new_page()
page.goto('https://example.com')
browser.close()
3.8 网络拦截
Playwright 允许你拦截和修改网络请求。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
# 拦截所有请求
def handle_request(route, request):
print(request.url)
route.continue_() # 继续请求
page.route('**/*', handle_request)
page.goto('https://example.com')
browser.close()
4. 常见应用场景
4.1 自动化登录
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto('https://www.example.com/login')
# 输入用户名和密码
page.fill('#username', 'your-username')
page.fill('#password', 'your-password')
# 点击登录按钮
page.click('#login-button')
browser.close()
4.2 抓取动态加载数据
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto('https://www.example.com/dynamic-content')
# 等待动态内容加载
page.wait_for_selector('.dynamic-content')
# 获取内容
content = page.inner_text('.dynamic-content')
print(content)
browser.close()
4.3 模拟下拉菜单选择
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto('https://www.example.com/form')
# 选择下拉菜单选项
page.select_option('#dropdown', 'value1')
browser.close()
5. 异步支持
Playwright 支持异步操作,适合需要高效处理多个任务的场景。
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto('https://www.example.com')
await page.screenshot(path='example.png')
await browser.close()
asyncio.run(main())
6. 测试框架集成
Playwright 可以与流行的测试框架(如 pytest)集成,用于编写端到端测试。
首先,安装 pytest 和 Playwright 的 pytest 插件:pip install pytest playwright pytest-playwright
然后,编写测试用例:
from playwright.sync_api import Page
def test_example(page: Page):
page.goto('https://example.com')
assert page.title() == 'Example Domain'
7. 调试技巧
7.1 慢动作模式
在操作过程中加入延迟,方便观察页面变化。
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto('https://example.com')
# 启用慢动作模式
page.click('a[href="/about"]', delay=1000) # 点击时延迟 1 秒
browser.close()
7.2 调试日志
启用调试日志,查看 Playwright 的内部操作。
DEBUG=pw:api python script.py
8. 总结
Playwright 是一个功能强大的浏览器自动化工具,适用于网页自动化测试、数据抓取和网页交互。通过掌握其基础用法和高级功能,你可以轻松实现各种浏览器自动化任务。Playwright 支持多浏览器、多语言,并且具有高效的异步操作能力,是现代浏览器自动化的首选工具之一。