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。