什么是并行化?
并行测试也称为并行执行。在并行测试中,我们在多个浏览器上并行测试不同的模块或应用程序,而不是一个接一个地测试它们。
并行化与顺序测试不同,顺序测试是指我们一个接一个地测试不同的模块或功能。即使在多个浏览器上测试应用程序时,测试也是在每个浏览器上顺序执行的。这种测试方法非常耗时。
并行执行有助于减少执行时间和工作量,从而缩短交付时间。它在跨浏览器测试、兼容性测试、本地化和国际化测试中特别有用。在我们需要检查两个版本的软件的稳定性和兼容性的情况下,我们可以同时运行这两个版本,并以更快的速度发现问题。
并行化意味着同时运行多个任务,这通常可以显著提高速度,尤其是在测试或执行任务时。
序列化是指任务按顺序一个接一个地执行,直到所有任务都完成。
在开始之前,有必要拥有 Browserless 服务。Browserless 可以解决复杂的网页抓取和大型自动化任务,并且现在已经实现了完全托管的云部署。
Browserless 采用以浏览器为中心的 approach,提供了强大的无头部署能力,并提供了更高的性能和可靠性。有关 Browserless 的更多信息,您可以点击这里 了解更多。
为什么要使用 Puppeteer?
Puppeteer 有很多维护者并且非常活跃。它也是由 Chrome 开发人员构建的,因此它是质量最高的库之一。因此,接下来我们将使用 Puppeteer 连接 Browserless 进行并行测试。
Puppeteer-cluster 可以创建多个 puppeteer 工作进程。这个库通过 Puppeteer 生成一个 Chromium 实例池,并帮助跟踪操作和错误。它可以帮助我们很好地进行并行测试,但这个库目前还不支持 puppeteer.connect
,因此无法连接到外部浏览器端口。
因此,在下面的示例中,我们将使用puppeteer-cluster-connect 代替:
npm install --save puppeteer
npm install --save puppeteer-cluster-connect
我们需要准备以下函数。只需填写您的 API 密钥和代理即可开始连接到 Browserless:
async function getBrowserWSEndpoint() {
const token = "您的 API 密钥"; // '您的代理'
const config = {
proxy: '您的代理', // 必填; 输入格式: schema://user:password@host:port 例如: http://user:password@localhost:8080
// platform: 'windows', // 支持: windows, mac, linux
// kernel: 'chromium', // 仅支持: chromium
// kernelMilestone: '128', // 支持: 128
// args: {
// "--proxy-bypass-list": "detect.nstbrowser.io"
// }, // 浏览器参数
// fingerprint: {
// userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36', // userAgent 支持从 v0.15.0 开始
// },
};
const query = new URLSearchParams({
token: token, // 必填
config: JSON.stringify(config),
});
return `https://less.nstbrowser.io/connect?${query.toString()}`;
}
接下来,我们需要使用 puppeteer-cluster-connect 的连接方法连接到 Browserless;
Concurrency
是并发实现的类型。这里我们设置 Cluster.CONCURRENCY_CONTEXT
,这意味着每个 URL 将创建一个不共享数据的隐形页面(BrowserContext);MaxConcurrency
是最大并发数。RestartFunction
是端口崩溃时重启端口的方法。此时,我们的 Browserless 集群已准备就绪!
import puppeteer from "puppeteer-core";
import { Cluster } from "puppeteer-cluster-connect"
const cluster = await Cluster.connect({
concurrency: Cluster.CONCURRENCY_CONTEXT,
maxConcurrency: 3,
// 提供 puppeteer-core 库
puppeteer,
puppeteerOptions: {
browserWSEndpoint: await getBrowserWSEndpoint(),
defaultViewport: null
},
// 在这里放入重启函数回调
restartFunction: getBrowserWSEndpoint,
});
console.log('cluster is Connected!');
接下来,我们将进行一个简单的并行测试。我们希望能够快速并行地批量访问多个站点,记录这些站点的标题,并在页面加载后进行截图,以测试这些站点是否可以正常访问。
task
方法创建一个任务。此任务包含每个浏览器实例对应的操作函数:await cluster.task(async ({ page, data }) => {
const { url, name } = data
// 访问目标站点
await page.goto(url);
console.log(`[${name} page loaded]:`, url);
// 获取文档标题
const documentTitle = await page.evaluate(() => document.title)
console.log(`[${name} title]:`, documentTitle);
// 拍摄截图
await page.screenshot({ fullPage: true, path: `${name}.png` });
});
queue
方法应该用于将需要并行测试的数据添加到集群中idle
和 close
方法关闭集群和所有打开的浏览器实例:cluster.queue({ url: "https://www.google.com", name: 'google' });
cluster.queue({ url: "https://www.wikipedia.org", name: 'wikipedia' });
cluster.queue({ url: "https://github.com/", name: 'github' });
await cluster.idle();
await cluster.close();
您可以在 Nstbrowser 客户端的 Browserless 菜单中查看最近请求的统计信息和剩余会话时间。
您是否总是需要将工作并行化?并行运行测试总是需要访问多个平台和浏览器,这会增加我们的测试成本。
此外,我们可能会遇到无法访问所有浏览器和版本的 situation。Browserless 可以轻松帮助您解决上述问题。只需 4 个简单的步骤,即可轻松完成并行测试。