一、Selenium
Selenium 是一款非常流行的开源自动化测试工具。
支持所有主流浏览器。
支持多种编程语言(Python、Java、C#、Ruby 等)。
稳定性高,在 Web 应用的自动化测试中非常稳定,广泛用于企业级测试。
维护良好
Selenium 用 python示例:获取页面标题
安装:
pip install selenium
需要配置浏览器驱动 例如:Chrome浏览器 需要下载 chromedriver
Chrome for Testing availability
from selenium import webdriver
# 启动 Chrome 浏览器
driver = webdriver.Chrome()
# 访问页面
driver.get("https://example.com")
# 获取页面标题
print(driver.title)
# 关闭浏览器
driver.quit()
二、Puppeteer
Puppeteer 是由 Google 提供的一个 Node.js 库,专门用于控制 Chromium 浏览器进行自动化操作。
专注于 Chromium 浏览器。
专注于 JavaScript/Node.js。
Puppeteer 使用 async/await 语法,支持异步操作,使代码更简洁。
Puppeteer 示例:获取页面标题
安装:
npm install puppeteer
// 用 require 引入 puppeteer 库
//(前提是你已经通过 npm install puppeteer 安装了它)。
const puppeteer = require('puppeteer');
//定义并立即执行一个 异步函数(async IIFE)。
// Puppeteer 的很多 API 是基于 Promise 的,
//你需要用 await 去等待它们的结果,必须放在 async 函数中。
(async () => {
// 启动 Puppeteer
//headless: true 表示不会弹出图形化的浏览器窗口(更轻便、更适合自动化和服务器端操作)。
//browser 是浏览器对象,可以用来创建页面、访问标签页、操作窗口等。
const browser = await puppeteer.launch({ headless: true });
// 创建新的页面
// 创建一个新的标签页(Page 对象)。
// 就像你在 Chrome 打开一个新标签一样,后续的所有网页操作都在这个对象上进行。
const page = await browser.newPage();
// 访问网页
// 让浏览器打开 https://www.baidu.com 网页,相当于你在地址栏输入这个网址按下回车。
// goto() 会等待页面加载完成
await page.goto('https://www.baidu.com');
// 获取页面标题
// 获取当前网页的 <title> 内容。
// 相当于在浏览器中运行 document.title,Puppeteer 内部就是通过 JavaScript 执行获取的。
const title = await page.title();
console.log(title);
// 关闭浏览器
await browser.close();
})();
三、Playwright
Playwright 是由 Microsoft 开发的开源自动化测试框架,是新一代跨浏览器自动化工具。
目前支持的浏览器:Chromium、Firefox 和 WebKit(Safari 引擎)。
支持 Python / Node.js / Java / C# 语言
Playwright 可以拦截网络请求、模拟网络环境,非常适合用于模拟复杂的 Web 应用场景。
Playwright 用 python 示例:获取页面标题
安装 Python API
pip install playwright
安装 Playwright 所需的浏览器内核
playwright install
# 从 playwright 的同步 API 中导入 sync_playwright,用于控制浏览器。
from playwright.sync_api import sync_playwright
def main():
# 使用 with 上下文打开 Playwright 控制器(p),这样退出后会自动清理资源。
with sync_playwright() as p:
# 启动一个 Chromium 浏览器(也就是 Chrome)实例,后续可以用它创建网页。
browser = p.chromium.launch(headless=True)
# 在浏览器中新建一个标签页,返回一个 page 对象。
# 类似于你手动打开了一个新的网页 tab。
# 所有后续网页操作(访问网页、点击按钮、获取元素)都在这个 page 对象上进行。
page = browser.new_page()
# 让浏览器跳转(请求)指定的 URL。timeout=60000 表示设置最大等待时间为 60 秒。
page.goto("https://movie.douban.com/top250", timeout=60000)
# 显式等待页面中所有电影条目(每部电影一个 <li>)出现,确保页面已经加载完成。
# .grid_view li 是豆瓣电影列表的每个电影条目的选择器。
page.wait_for_selector(".grid_view li")
# 获取页面中所有电影条目元素,返回一个列表
# 每个元素都是一个电影的 <li> DOM 节点。
items = page.query_selector_all(".grid_view li")
for item in items:
# 在每个电影条目中,选取 .title 类(即电影名所在的标签),提取其纯文本内容。
title = item.query_selector(".title").inner_text()
print(title)
browser.close()
main()
功能和易用性对比
功能项 | Selenium | Puppeteer | Playwright |
---|---|---|---|
API 现代化 | ✖️ 较老派 | ✔️ 简洁 | ✔️ 更现代更强大 |
无头模式 | ✔️ | ✔️ | ✔️ |
页面截图 | ✔️ | ✔️ | ✔️ |
录制视频 | ✖️ 需要配合第三方 | ✔️(用插件) | ✔️(内建) |
捕获网络请求 | 需要插件 | ✔️ | ✔️✔️(支持拦截、伪造、修改请求) |
多标签页/上下文隔离 | 有限制 | 有 | ✔️ 支持浏览器隔离上下文 |
模拟行为(鼠标轨迹等) | 基础支持 | ✔️ | ✔️✔️(可以精细控制,防反爬) |
稳定性与反爬能力对比
项目 | Selenium | Puppeteer | Playwright |
---|---|---|---|
反爬特征明显 | ✔️(容易被检测) | 中等(稍好) | 最强(可以模拟真实用户操作)✔️✔️ |
拦截请求 / 模拟响应 | ✖️ 不支持 | ✔️ | ✔️✔️ |
支持验证码识别辅助 | ✖️ | 可以集成 | ✔️ 自动截图 + OCR 最好集成 |
项目适用场景对比
场景 | 推荐工具 |
---|---|
自动化测试(兼容各种浏览器) | Selenium |
控制 Chrome 抓 JS 数据 | Puppeteer / Playwright |
要模拟真实用户行为(防反爬) | ✔️ Playwright |
要跨浏览器(如模拟 Safari) | ✔️ Playwright(支持 WebKit) |
使用 Python 写爬虫 | Selenium / ✔️ Playwright |
要抓包 / 拦截接口 / 构造 POST 请求 | ✔️✔️ Playwright |
总结推荐表
要求 | 推荐 |
---|---|
学术稳定、兼容性强 | Selenium |
JS 项目 + Chrome 操作 | Puppeteer |
高级爬虫 / 渗透测试 / 破解验证 | Playwright(最强)✔️✔️✔️ |