Selenium 与 Puppeteer:该用哪一个?
比较 Puppeteer 和 Selenium 有助于你选择合适的 Web 自动化与测试工具。Puppeteer 在五年前推出,因其强大的功能和广泛的适用场景而迅速流行。另一方面,Selenium 自 2004 年问世以来一直是 Web 自动化的常青树,它能与多种编程语言和系统配合工作。接下来我将带你详细对比这两个框架,帮助你判断哪一个更适合你的需求。

主要特性与使用场景
Selenium
Selenium 是一个测试工具,支持的浏览器不止 Chrome 和 Chromium——它还支持 Firefox、Safari、Opera 和 Microsoft Edge。你可以用 JavaScript、Ruby、C#、Java 或 Python 编写 Selenium 脚本,这让开发者可以用自己熟悉的语言运行高级测试,并用同一个工具测试多种浏览器。
Selenium 还包含 Selenium WebDriver、Selenium IDE 和 Selenium Grid 等组件。这些附加组件让 Selenium 更加强大,帮助用户满足不同的测试需求。
Selenium 常用于以下任务:
-
自动化测试。
-
Web 应用测试。
-
Web 性能测试。
-
性能压测。
-
数据抓取(你可以在我们详尽的 Selenium 教程中学习如何用 Python 抓取网页)。
Puppeteer
Puppeteer 主要是一个用于自动化测试的 Node.js 库。它由 Google 开发,用 DevTools 协议来控制 Chrome 和 Chromium。
与支持多种编程语言的 Selenium 不同,Puppeteer 只专注于 JavaScript。它就像 Chrome 的遥控器,提供特定的控制结构。Puppeteer 通过聚焦 JavaScript 与 Chrome 简化了测试流程,而 Selenium 的路线更为广泛。
Puppeteer 被开发者广泛用于以下任务:
-
借助 Puppeteer 简化对 Chrome 扩展的测试。
-
有助于为 UI 测试截取截图和生成 PDF。
-
便于在最新的 Chromium 版本上进行测试。
-
将表单提交、键盘输入等手工测试流程自动化。
-
也常用于网页抓取任务,并有详细教程可供参考。
优缺点对比
要找出最适合你的工具,比较 Puppeteer 和 Selenium 的优缺点至关重要。本节我们拆解两者的主要优势与不足。
Selenium
优势:
-
支持多种浏览器、平台与编程语言。
-
内置 WebDriver、IDE、Grid 等测试与自动化工具。
-
易于集成 CI/CD,增强整体能力。
劣势:
-
由于支持多平台、多语言、多浏览器,安装配置相对复杂。
-
不具备与 Puppeteer 相同层次的性能管理功能。
-
学习曲线相对较陡。
Puppeteer
优势:
-
通过 DevTools 协议控制被广泛使用的 Chrome 浏览器。
-
仅支持一个浏览器与一门语言,使得运行速度更快。
-
无需独立的浏览器驱动,依赖更少。
-
提供截图、加载性能记录等性能管理工具。
劣势:
-
只支持 JavaScript 编程。
-
仅限于 Chrome 浏览器。
搭建与网页抓取的差异
安装
搭建 Puppeteer 与 Selenium 的环境都不难。关键差别在所需库上:Puppeteer 用户可用一个 npm 命令安装;而 Selenium 用户需要根据具体语言遵循相应的安装步骤。
Selenium
-
npm install selenium-webdriver
-
npm install chromedriver
Puppeteer
-
npm install puppeteer
浏览器控制与网页抓取
两种工具都允许你通过代码控制浏览器,从网页中获取动态内容。我们来比较一些关键步骤,比如启动无头 Chrome、打开网页、等待内容加载、并进行抓取。
我们将使用 http://quotes.toscrape.com/js/ 进行抓取。这是一个动态页面,名言通过 JavaScript 加载。名言展示在带有 quote 类名的<DIV> 元素中。
步骤 1 — 依赖与设定目标
Selenium:
-
const { Builder, By, Key, until } = require(‘selenium-webdriver’);
-
const chrome = require(‘selenium-webdriver/chrome’);
-
const url = ‘http://quotes.toscrape.com/js/';
Puppeteer:
-
const puppeteer = require(‘puppeteer’);
-
const url = ‘http://quotes.toscrape.com/js/';
Selenium 可搭配不同浏览器,需要相应的驱动(如 ChromeDriver)。Puppeteer 已内置与 Chrome 的绑定,无需单独引入驱动。
步骤 2 — 启动无头 Chrome 会话并访问目标 URL
Selenium:
-
let driver = await new Builder().forBrowser(‘chrome’) .setChromeOptions(new chrome.Options().headless()).build();
-
await driver.get(url);
Puppeteer:
-
const headlessBrowser = await puppeteer.launch({ headless: true });
-
const newTab = await headlessBrowser.newPage();
-
await newTab.goto(url);
Puppeteer 使用可等待的 launch() 方法启动浏览器,然后用 newPage() 创建新标签页,之后通过 goto() 方法导航到任意 URL。
相对地,Selenium 使用 Builder() 构造函数创建一个新的 Builder 实例,设置相关选项后,通过 build() 生成并返回新的 WebDriver 会话实例。
请记住,所有可等待的调用都需要放在异步函数中。
步骤 3 — 等待动态内容加载
现在来比较它们等待特定 JavaScript 内容加载的方式。下面的代码演示了等待带有 quote 类名的**
** 元素出现。
Selenium:
-
await driver.wait(until.elementLocated(By.className(‘quote’)));
Puppeteer:
-
await newTab.waitForSelector(‘.quote’);
在 Puppeteer 中,你使用 waitForSelector() 等待特定元素加载;而在 Selenium 中,你通过 wait() 方法与 until 属性实现相同的等待行为。
步骤 4 — 抓取名言
在 Puppeteer 中,你可以使用 querySelectorAll() 按给定的 CSS 选择器选取并获取所有匹配元素的列表;相对地,Selenium 提供 findElements() 方法以按指定的 By 选择器获取相关元素。
Selenium:
let quotes = await driver.findElements(By.className('quote'));
let quotesString = "";
for (let quote of quotes) {
let qouteText = await quote.findElement(By.className('text')). getText();
quotesString += ${qouteText} \n;
}
console.log(quotesString);
Puppeteer:
let quotes = await newTab.evaluate(() => {
let allQuoteDivs = document.querySelectorAll(".quote");
let quotesString= "";
allQuoteDivs.forEach((quote) => {
let qouteText = quote.querySelector(".text").innerHTML;
quotesString += ${qouteText} n;
});
return quotesString;
});
console.log(quotes);
Puppeteer 的 evaluate() 方法可以在当前页面上下文中运行函数,从而与当前页面的 DOM 进行交互与修改。最后你可以从该函数返回一个值,本例中即 quotesString。
步骤 5 — 关闭浏览器
Puppeteer 使用 close() 方法关闭浏览器实例;Selenium 则使用 quit() 方法退出浏览器实例并终止驱动会话。
Selenium:
-
await driver.quit();
Puppeteer:
-
headlessBrowser.close();
Puppeteer vs. Selenium:2024 年哪一个更好
Puppeteer 和 Selenium 都是流行的浏览器自动化工具,但存在一些关键差异。概览如下:

你该选择哪一个?
在 Puppeteer 与 Selenium 之间选择要视你的具体需求而定。如果你主要使用 Chrome,Puppeteer 是更好的选择。它易用且对浏览器的控制能力强,能高效完成测试搭建。此外,Puppeteer 更专注于 Web 自动化,对网页爬取与抓取等任务也很方便。
然而,如果你需要同时支持多种浏览器与编程语言,那就选择 Selenium。它的 WebDriver 支持多种浏览器并可直接交互,无需额外工具即可拓展测试可能性。尤其在跨浏览器兼容性至关重要的场景中,我发现 Selenium 十分有用。因此,在做决定前请仔细评估你的需求,选择最适合的工具。
结语
本文比较了两大主流自动化框架:Puppeteer 与 Selenium。两者各有特性与优势。我的目标是帮助你明确项目需求,从而选出最合适的工具。
如果你仍不确定在数据采集项目中该用哪一个,可以看看我对其他网页抓取工具的对比。我也提供了 顶级反检测浏览器 的概览,帮助你做出决策。
同时也可以考虑尝试更先进的网页抓取方案,这些方案内置了诸多功能以简化流程。无论是数据采集还是网站测试,都有很多工具可以大幅提升效率!
403

被折叠的 条评论
为什么被折叠?



