Playwright与Selenium的对比
明白了!既然你有 Python 和 Selenium 的基础,那学习 Playwright 会非常快。我们来用你熟悉的视角来讲解。
Playwright vs Selenium:程序员视角
把它们都看作是 "浏览器遥控器",但 Playwright 是新一代的、功能更强的遥控器。
相同点:
- 都是自动化测试框架
- 都支持多种浏览器
- 都支持多种编程语言(Python、Java、JavaScript等)
- 基本操作逻辑相似(定位元素、点击、输入等)
关键差异:
| 特性 | Selenium | Playwright |
|---|---|---|
| 架构 | 通过浏览器驱动通信 | 直接与浏览器调试协议通信 |
| 速度 | 较慢 | 更快(无需中间驱动) |
| 自动等待 | 需要显式等待 | 内置智能等待 |
| 移动端 | 需要额外配置 | 内置移动设备模拟 |
| 录制功能 | 需要第三方工具 | 内置代码生成器 |
在 PyCharm 中设置 Playwright(Python版)
步骤 1:创建虚拟环境(推荐)
# 在 PyCharm 终端中执行
python -m venv playwright_env
source playwright_env/bin/activate # Linux/Mac
# 或
playwright_env\Scripts\activate # Windows
步骤 2:安装 Playwright
pip install playwright
步骤 3:安装浏览器
playwright install
这个命令会自动下载 Chrome、Firefox、WebKit 浏览器。
从 Selenium 到 Playwright:代码对比
基础启动浏览器对比
Selenium 方式:
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
Playwright 方式:
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.baidu.com")
元素定位和操作对比
Selenium:
# 定位元素
search_box = driver.find_element(By.ID, "kw")
search_btn = driver.find_element(By.ID, "su")
# 操作
search_box.send_keys("Selenium测试")
search_btn.click()
# 显式等待
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "content_left"))
)
Playwright:
# 定位和操作一气呵成
page.fill("#kw", "Playwright测试") # 相当于 find_element + send_keys
page.click("#su") # 相当于 find_element + click
# 智能等待 - 不需要显式等待,Playwright 会自动等待元素可交互
# 如果需要显式等待:
page.wait_for_selector("#content_left")
Playwright 的核心优势(你会喜欢的)
1. 自动等待机制
Playwright 在执行操作前会自动等待元素:
- 可点击
- 可填充
- 可见
- 启用状态
这意味着你很少需要写 WebDriverWait 这样的代码。
2. 强大的选择器
# CSS 选择器
page.click("#search")
# XPath
page.click("//button[@id='search']")
# 文本选择器(超实用!)
page.click("text=登录")
page.click("text='确 定'") # 包含空格的文本
# 组合选择器
page.click("#header >> text=首页")
3. 录制代码生成器
Playwright 自带一个代码录制工具,可以生成 Python 代码:
playwright codegen https://www.baidu.com
运行这个命令会打开浏览器和一个代码窗口,你在浏览器中的操作会实时生成对应的 Python 代码。
4. 移动设备模拟
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
# 模拟 iPhone
iphone = p.devices["iPhone 12"]
browser = p.chromium.launch(headless=False)
context = browser.new_context(**iphone)
page = context.new_page()
page.goto("https://m.baidu.com")
5. 网络拦截和 Mock
# 拦截请求
page.route("**/*.json", lambda route: route.fulfill(
status=200,
body='{"mock": "data"}'
))
# 或者直接阻止图片加载提升速度
page.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
完整的 Playwright Python 示例
from playwright.sync_api import sync_playwright
def test_baidu_search():
with sync_playwright() as p:
# 启动浏览器
browser = p.chromium.launch(headless=False)
page = browser.new_page()
try:
# 导航到百度
page.goto("https://www.baidu.com")
# 输入搜索词
page.fill("#kw", "Playwright Python")
# 点击搜索按钮
page.click("#su")
# 等待搜索结果加载
page.wait_for_selector("#content_left")
# 截图保存
page.screenshot(path="search_results.png")
# 获取第一个结果的标题
first_result = page.query_selector("#content_left >> .result >> a")
if first_result:
title = first_result.text_content()
print(f"第一个结果: {title}")
finally:
# 关闭浏览器
browser.close()
if __name__ == "__main__":
test_baidu_search()
调试技巧(在 PyCharm 中)
1. 慢动作模式
browser = p.chromium.launch(
headless=False,
slow_mo=1000 # 每个操作延迟1秒,方便观察
)
2. 打开开发者工具
browser = p.chromium.launch(
headless=False,
devtools=True # 自动打开开发者工具
)
3. PyCharm 调试
直接在 PyCharm 中设置断点,像调试普通 Python 代码一样调试你的 Playwright 脚本。
墨者看遍天下皆是丹青,测试看尽万物皆是bug

浙公网安备 33010602011771号