Skip to content

Astral:用于Deno的浏览器自动化库

Posted on:2024年6月10日 at 22:30

Astral 是一个专为 Deno 编写的高层次浏览器自动化库,类似于 Puppeteer 和 Playwright。它旨在提供对网页浏览器的控制,主要用于自动化和测试。本文将介绍 Astral 的一些基本使用方法。

安装 Astral

首先,使用以下命令安装 Astral:

deno add @astral/astral

截屏功能

使用 Astral 可以轻松地截取网页截图。以下是一个简单的示例:

// 导入 Astral
import { launch } from "jsr:@astral/astral";

// 启动浏览器
const browser = await launch();

// 打开新页面
const page = await browser.newPage("https://deno.land");

// 截取页面截图并保存到磁盘
const screenshot = await page.screenshot();
Deno.writeFileSync("screenshot.png", screenshot);

// 关闭浏览器
await browser.close();

在浏览器上下文中运行代码

Astral 允许在浏览器上下文中运行代码,并获取执行结果。以下示例展示了如何实现这一点:

// 导入 Astral
import { launch } from "jsr:@astral/astral";

// 启动浏览器
const browser = await launch();

// 打开新页面
const page = await browser.newPage("https://deno.land");

// 在浏览器上下文中运行代码
const value = await page.evaluate(() => {
  return document.body.innerHTML;
});
console.log(value);

// 传递参数并运行代码
const result = await page.evaluate((x, y) => {
  return `The result of adding ${x}+${y} = ${x + y}`;
}, {
  args: [10, 15],
});
console.log(result);

// 关闭浏览器
await browser.close();

页面导航与交互

使用 Astral 可以在页面上进行导航和交互,例如点击按钮、输入文本等。以下是一个示例:

// 导入 Astral
import { launch } from "jsr:@astral/astral";

// 启动浏览器,非无头模式
const browser = await launch({ headless: false });

// 打开网页
const page = await browser.newPage("https://deno.land");

// 点击搜索按钮
const button = await page.$("button");
await button!.click();

// 在搜索输入框中输入文本
const input = await page.$("#search-input");
await input!.type("pyro", { delay: 1000 });

// 等待搜索结果返回
await page.waitForNetworkIdle({ idleConnections: 0, idleTime: 1000 });

// 点击 'pyro' 链接
const xLink = await page.$("a.justify-between:nth-child(1)");
await Promise.all([
  page.waitForNavigation(),
  xLink!.click(),
]);

// 点击 'pyro.deno.dev' 链接
const dLink = await page.$(
  ".markdown-body > p:nth-child(8) > a:nth-child(1)",
);
await Promise.all([
  page.waitForNavigation(),
  dLink!.click(),
]);

// 关闭浏览器
await browser.close();

连接远程浏览器

如果已经在其他地方运行了浏览器进程,或者使用了提供远程浏览器的服务(如 browserless.io),可以直接连接到其端点,而不是启动新进程。

// 导入 Astral
import { launch } from "jsr:@astral/astral";

// 连接到远程端点
const browser = await launch({
  wsEndpoint: "wss://remote-browser-endpoint.example.com",
});

// 执行操作
const page = await browser.newPage("http://example.com");
console.log(await page.evaluate(() => document.title));

// 关闭连接
await browser.close();

重新使用已启动的浏览器

Astral 还支持重用已启动的浏览器,通过暴露浏览器的 WebSocket 端点可以实现这一点。

// 启动浏览器进程
const browser = await launch();

// 连接到已启动的浏览器
const anotherBrowser = await launch({ wsEndpoint: browser.wsEndpoint() });

更多信息请访问https://jsr.io/@astral/astral