前言

在Web自动化领域,Selenium曾经是无可争议的王者。然而,随着现代网页应用变得越来越复杂(动态内容、SPA、WebSocket),传统的自动化工具开始显得力不从心。为了应对这些挑战,一个更现代化、更快速、更可靠的工具应运而生——它就是由微软开发的Playwright

Playwright是为现代Web应用量身打造的浏览器自动化库。它提供了统一的API来控制Chromium(Chrome, Edge)、Firefox和WebKit(Safari),并拥有许多激动人心的特性,如自动等待、网络拦截、多页面/多上下文等。

无论你是想做端到端(E2E)测试、网页截图,还是构建复杂的网络爬虫,Playwright都能提供前所未有的开发体验。本文将带你入门Playwright for Python,领略其强大之处。

环境准备

1. 安装Playwright

首先,安装Playwright的Python包:

pip install playwright

2. 安装浏览器驱动

Playwright需要下载它所支持的浏览器的驱动文件。只需一条命令即可完成:

playwright install

这条命令会下载Chromium、Firefox和WebKit的最新版本,并将它们存储在本地缓存中,供Playwright使用。

核心概念:为可靠性而设计

Playwright的设计核心是可靠性。它通过以下几个关键特性解决了传统自动化工具常见的“ flaky tests”(不稳定的测试)问题:

  • 自动等待 (Auto-Waits): Playwright的每一个交互操作(如click(), fill())都会自动等待目标元素变得“可操作”(例如,可见、稳定、已附加到DOM)。你不再需要手动添加sleep()或显式等待,代码更简洁,执行也更可靠。
  • Web-First断言: Playwright的断言(Assertions)是专门为动态Web设计的。例如,expect(locator).to_be_visible()会智能地等待元素可见,而不是在检查时立即失败。
  • 追踪 (Tracing): Playwright可以录制测试执行的完整轨迹,包括DOM快照、网络请求和控制台日志。当测试失败时,你可以得到一个包含所有信息的HTML报告,轻松复现和调试问题,就像拥有一个时间机器一样。

实战:编写你的第一个Playwright脚本

让我们来编写一个简单的脚本,它会访问Hacker News,搜索“Playwright”,并截取搜索结果页面的图片。

1. 同步 vs. 异步API

Playwright同时提供了同步和异步两种API。对于初学者和大多数脚本,同步API更简单直观。我们将使用同步API。

2. 编写脚本

创建一个名为hackernews_scraper.py的文件:

from playwright.sync_api import sync_playwright, expect

def run(playwright):
    # 启动Chromium浏览器
    browser = playwright.chromium.launch(headless=False) # headless=False可以看到浏览器界面
    
    # 创建一个新的浏览器上下文和页面
    context = browser.new_context()
    page = context.new_page()
    
    # 1. 访问Hacker News
    page.goto("https://news.ycombinator.com")
    
    # 2. 找到搜索框并输入"Playwright"
    # Playwright的locator非常强大,支持CSS选择器、XPath、文本内容等
    search_box = page.locator('input[name="q"]')
    search_box.fill("Playwright")
    
    # 3. 按下回车键提交搜索
    search_box.press("Enter")
    
    # 4. 等待搜索结果加载
    # 我们可以等待特定的元素出现来确认页面加载完成
    first_result = page.locator("li.Story").first
    expect(first_result).to_be_visible() # 使用web-first断言
    
    print(f"页面标题: {page.title()}")
    
    # 5. 截取页面
    page.screenshot(path="hn_playwright_results.png")
    
    # 关闭浏览器
    browser.close()

with sync_playwright() as playwright:
    run(playwright)

print("脚本执行完毕,截图已保存为 hn_playwright_results.png")

3. 执行脚本

在终端中运行它:

python hackernews_scraper.py

你会看到一个浏览器窗口自动打开,执行我们定义好的所有操作,然后关闭。执行完毕后,项目目录下会生成一张名为hn_playwright_results.png的截图。

Codegen:自动生成代码

Playwright最酷的功能之一是Codegen。它可以记录你在浏览器中的操作,并自动为你生成Playwright脚本。这对于初学者学习API或快速创建测试脚本来说是绝佳的工具。

在终端中运行以下命令:

playwright codegen https://github.com

这会打开一个浏览器窗口和一个Playwright Inspector窗口。现在,你在浏览器中的所有操作(点击、输入等)都会被记录下来,并实时转换成Python代码显示在Inspector中。完成操作后,复制生成的代码即可。

Playwright Codegen

总结

Playwright通过其现代化的API、强大的可靠性特性和出色的开发者工具(如Codegen和Tracing),为浏览器自动化设立了新的标杆。它大大降低了编写稳定、高效的自动化脚本的难度。

相比于Selenium,Playwright提供了更快的执行速度、更可靠的操作和更丰富的功能(如网络拦截)。这使得它不仅是E2E测试的理想选择,也成为构建健壮网络爬虫和执行任何浏览器自动化任务的首选工具。

这四天的系列文章我们介绍了从AI智能体框架(MetaGPT, CrewAI)到Web应用构建(Streamlit)再到浏览器自动化(Playwright)的多个强大工具。希望这些内容能为你打开新的思路,帮助你在AI和自动化时代保持领先。