泡芙

泡芙

技术爱好者 · 探索者

← 返回文章列表

浏览器自动化实战:用 Playwright 解放双手

作为研究生或开发者,我们每天都在和浏览器打交道——填表格、截图、批量下载文件、自动化测试...这些重复性操作耗费了大量时间。今天来介绍一款强大的浏览器自动化工具:Playwright

为什么选择 Playwright?

Playwright 是微软开源的浏览器自动化框架,相比 Selenium 和 Puppeteer,它有以下优势:

  • 原生支持等待 - 自动等待元素加载完成,减少 flaky tests
  • 多浏览器支持 - Chromium、Firefox、WebKit 一套代码多端运行
  • 强大的调试工具 - 内置 Playwright Inspector,调试超方便
  • 现代 API 设计 - Promise 风格,代码简洁易读

快速开始

首先安装 Playwright:

npm init playwright@latest

或者在已有项目中添加:

npm install -D @playwright/test
npx playwright install chromium

第一个自动化脚本

让我们来实现一个简单的场景:自动打开搜索引擎,输入关键词,获取结果。

const { chromium } = require('playwright');

(async () => {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  
  // 打开搜索引擎
  await page.goto('https://www.bing.com');
  
  // 输入搜索关键词
  await page.fill('input[name="q"]', 'Playwright 教程');
  
  // 点击搜索按钮
  await page.click('input[type="submit"]');
  
  // 等待结果加载
  await page.waitForLoadState('networkidle');
  
  // 获取搜索结果标题
  const results = await page.$$eval('h2 a', links => 
    links.map(link => link.textContent).slice(0, 5)
  );
  
  console.log('搜索结果:', results);
  
  await browser.close();
})();

常用操作技巧

1. 截图功能

// 整个页面截图
await page.screenshot({ path: 'screenshot.png', fullPage: true });

// 指定元素截图
await page.locator('.content').screenshot({ path: 'element.png' });

2. 文件下载

// 监听下载事件
const download = await page.waitForEvent('download', async () => {
  await page.click('a.download-button');
});
await download.saveAs('./downloads/file.pdf');

3. 表单自动填充

await page.fill('#username', 'myusername');
await page.fill('#password', 'mypassword');
await page.click('button[type="submit"]');

4. 等待特定元素

// 等待元素出现
await page.waitForSelector('.loading-spinner', { state: 'hidden' });

// 等待网络请求完成
await page.waitForResponse(response => 
  response.url().includes('/api/data') && response.status() === 200
);

实战案例:批量获取网页数据

假设我们需要从一个博客网站批量获取文章标题和链接:

const { chromium } = require('playwright');

async function scrapeBlog(url) {
  const browser = await chromium.launch();
  const page = await browser.newPage();
  
  await page.goto(url);
  
  // 等待文章列表加载
  await page.waitForSelector('.article-item');
  
  // 提取文章数据
  const articles = await page.$$eval('.article-item', items => {
    return items.map(item => ({
      title: item.querySelector('h3').textContent,
      link: item.querySelector('a').href,
      date: item.querySelector('.date').textContent
    }));
  });
  
  await browser.close();
  return articles;
}

// 使用
scrapeBlog('https://example.com/blog')
  .then(articles => console.log(articles))
  .catch(console.error);

与 AI 结合的妙用

Playwright 还可以和 AI 结合,实现更智能的自动化:

  • AI 辅助元素定位 - 用视觉模型识别按钮位置
  • 智能内容提取 - 配合 LLM 提取非结构化网页数据
  • 自动生成测试用例 - AI 分析页面生成 Playwright 测试代码

总结

Playwright 是现代浏览器自动化的利器,它让重复性的网页操作变得简单高效。无论是批量数据采集、自动化测试,还是工作流自动化,Playwright 都能帮你轻松搞定。

快去试试吧,让你的双手从繁琐的重复操作中解放出来!🐱

"Automate the boring stuff, focus on what matters." — 泡芙