Selenium 与 Puppeteer:该用哪一个?

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

  1. npm install selenium-webdriver

  2. npm install chromedriver

Puppeteer

  1. npm install puppeteer

浏览器控制与网页抓取

两种工具都允许你通过代码控制浏览器,从网页中获取动态内容。我们来比较一些关键步骤,比如启动无头 Chrome、打开网页、等待内容加载、并进行抓取。

我们将使用 http://quotes.toscrape.com/js/ 进行抓取。这是一个动态页面,名言通过 JavaScript 加载。名言展示在带有 quote 类名的<DIV> 元素中。

步骤 1 — 依赖与设定目标

Selenium:

  1. const { Builder, By, Key, until } = require(‘selenium-webdriver’);

  2. const chrome = require(‘selenium-webdriver/chrome’);

  3. const url = ‘http://quotes.toscrape.com/js/';

Puppeteer:

  1. const puppeteer = require(‘puppeteer’);

  2. const url = ‘http://quotes.toscrape.com/js/';

Selenium 可搭配不同浏览器,需要相应的驱动(如 ChromeDriver)。Puppeteer 已内置与 Chrome 的绑定,无需单独引入驱动。

步骤 2 — 启动无头 Chrome 会话并访问目标 URL

Selenium:

  1. let driver = await new Builder().forBrowser(‘chrome’) .setChromeOptions(new chrome.Options().headless()).build();

  2. await driver.get(url);

Puppeteer:

  1. const headlessBrowser = await puppeteer.launch({ headless: true });

  2. const newTab = await headlessBrowser.newPage();

  3. await newTab.goto(url);

Puppeteer 使用可等待的 launch() 方法启动浏览器,然后用 newPage() 创建新标签页,之后通过 goto() 方法导航到任意 URL。

相对地,Selenium 使用 Builder() 构造函数创建一个新的 Builder 实例,设置相关选项后,通过 build() 生成并返回新的 WebDriver 会话实例。

请记住,所有可等待的调用都需要放在异步函数中。

步骤 3 — 等待动态内容加载

现在来比较它们等待特定 JavaScript 内容加载的方式。下面的代码演示了等待带有 quote 类名的**

** 元素出现。

Selenium:

  1. await driver.wait(until.elementLocated(By.className(‘quote’)));

Puppeteer:

  1. 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:

  1. await driver.quit();

Puppeteer:

  1. headlessBrowser.close();

Puppeteer vs. Selenium:2024 年哪一个更好

Puppeteer 和 Selenium 都是流行的浏览器自动化工具,但存在一些关键差异。概览如下:

你该选择哪一个?

在 Puppeteer 与 Selenium 之间选择要视你的具体需求而定。如果你主要使用 Chrome,Puppeteer 是更好的选择。它易用且对浏览器的控制能力强,能高效完成测试搭建。此外,Puppeteer 更专注于 Web 自动化,对网页爬取与抓取等任务也很方便。

然而,如果你需要同时支持多种浏览器与编程语言,那就选择 Selenium。它的 WebDriver 支持多种浏览器并可直接交互,无需额外工具即可拓展测试可能性。尤其在跨浏览器兼容性至关重要的场景中,我发现 Selenium 十分有用。因此,在做决定前请仔细评估你的需求,选择最适合的工具。

结语

本文比较了两大主流自动化框架:Puppeteer 与 Selenium。两者各有特性与优势。我的目标是帮助你明确项目需求,从而选出最合适的工具。

如果你仍不确定在数据采集项目中该用哪一个,可以看看我对其他网页抓取工具的对比。我也提供了 顶级反检测浏览器 的概览,帮助你做出决策。

同时也可以考虑尝试更先进的网页抓取方案,这些方案内置了诸多功能以简化流程。无论是数据采集还是网站测试,都有很多工具可以大幅提升效率!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值