← Browser Run / browser-run
Puppeteer
Puppeteer ↗ patří mezi nejoblíbenější knihovny, které pro vývojáře abstrahují nízkoúrovňový protokol DevTools a poskytují vysokoúrovňové API pro snadné ovládání Chrome/Chromium a automatizaci relací prohlížení. Puppeteer se používá pro úlohy jako vytváření snímků obrazovky, procházení stránek a testování webových aplikací.
Puppeteer se obvykle připojuje k místnímu prohlížeči Chrome nebo Chromium prostřednictvím portu DevTools. Podrobnosti najdete v Dokumentaci k Puppeteer API najdete na Puppeteer.connect() metoda ↗ s dalšími informacemi.
Tým Workers vytvořil fork Puppeteeru a upravil ho tak, aby se místo toho připojoval k rozhraní Workers Browser Run API. Po připojení pak mohou vývojáři využívat celé Puppeteer API ↗ jako by tomu bylo při standardním nastavení.
Naše verze je open source a najdete ji v Fork knihovny Puppeteer od Cloudflare ↗. Npm lze nainstalovat z npmjs ↗ jako @cloudflare/puppeteer ↗:
npm i -D @cloudflare/puppeteerPoužití Puppeteer ve Worker
Jakmile vazba pro prohlížeč je nakonfigurováno a @cloudflare/puppeteer je nainstalovaná, lze Puppeteer použít ve workeru:
import puppeteer from "@cloudflare/puppeteer";
export default {
async fetch(request, env) {
const browser = await puppeteer.launch(env.MYBROWSER);
const page = await browser.newPage();
await page.goto("https://example.com");
const metrics = await page.metrics();
await browser.close();
return Response.json(metrics);
},
};import puppeteer from "@cloudflare/puppeteer";
interface Env {
MYBROWSER: Fetcher;
}
export default {
async fetch(request, env): Promise<Response> {
const browser = await puppeteer.launch(env.MYBROWSER);
const page = await browser.newPage();
await page.goto("https://example.com");
const metrics = await page.metrics();
await browser.close();
return Response.json(metrics);
},
} satisfies ExportedHandler<Env>;Tento skript spustí se ↗ env.MYBROWSER prohlížeč, otevře nová stránka ↗, přejde na ↗ https://example.com/ ↗, získá načtení stránky metriky ↗, se zavírá ↗ prohlížeč a vypíše metriky ve formátu JSON.
Keep Alive
Pokud uživatelé vynechají browser.close() příkaz, zůstane otevřená, připravená k opětovnému připojení a znovu použité ve výchozím nastavení se však po 1 minutě nečinnosti automaticky uzavře. Uživatelé mohou tuto dobu nečinnosti volitelně prodloužit až na 10 minut pomocí keep_alive nastavenou v milisekundách:
const browser = await puppeteer.launch(env.MYBROWSER, { keep_alive: 600000 });Při použití výše uvedeného zůstane prohlížeč otevřený až 10 minut, i když je nečinný.
Nastavení vlastního user-agenta
Chcete-li v Puppeteer zadat vlastní user agent, použijte page.setUserAgent() metoda. To se hodí, pokud cílový web zobrazuje různý obsah podle user agenta.
await page.setUserAgent(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
);Místní ladění v režimu headful (experimentální)
Při lokálním vývoji s wrangler dev nebo vite dev, Chrome ve výchozím nastavení běží v režimu headless. Chcete-li spustit Chrome ve viditelném režimu (headful), nastavte X_BROWSER_HEADFUL proměnnou prostředí:
X_BROWSER_HEADFUL=true npx wrangler devNebo pomocí Cloudflare Vite plugin:
X_BROWSER_HEADFUL=true npx vite devTím se otevře okno prohlížeče, takže můžete v reálném čase sledovat svou automatizaci v Puppeteer, což usnadňuje ladění navigace, výběru prvků a interakcí se stránkou.
Výběr prvků
Puppeteer nabízí několik metod pro výběr elementů na stránce. Selektory CSS fungují podle očekávání, selektory XPath ale kvůli bezpečnostním omezením v runtime Workers podporované nejsou.
Místo selektorů Xpath můžete použít selektory CSS nebo page.evaluate() ke spouštění dotazů XPath v kontextu prohlížeče:
const innerHtml = await page.evaluate(() => {
return (
// @ts-ignore this runs on browser context
new XPathEvaluator()
.createExpression("/html/body/div/h1")
// @ts-ignore this runs on browser context
.evaluate(document, XPathResult.FIRST_ORDERED_NODE_TYPE).singleNodeValue
.innerHTML
);
});Správa relací
Abychom usnadnili správu relací prohlížeče, přidali jsme nové metody do puppeteer:
Vypište otevřené relace
puppeteer.sessions() zobrazí aktuálně spuštěné relace. Vrátí výstup podobný tomuto:
[
{
"connectionId": "2a2246fa-e234-4dc1-8433-87e6cee80145",
"connectionStartTime": 1711621704607,
"sessionId": "478f4d7d-e943-40f6-a414-837d3736a1dc",
"startTime": 1711621703708
},
{
"sessionId": "565e05fb-4d2a-402b-869b-5b65b1381db7",
"startTime": 1711621703808
}
]Všimněte si, že relace 478f4d7d-e943-40f6-a414-837d3736a1dc má aktivní připojení workeru (connectionId=2a2246fa-e234-4dc1-8433-87e6cee80145), zatímco relace 565e05fb-4d2a-402b-869b-5b65b1381db7 je zdarma. Dokud je připojení aktivní, nemůže se k dané relaci připojit žádný jiný worker.
Vypište nedávné relace
puppeteer.history() zobrazí seznam nedávných relací, otevřených i uzavřených. Je to užitečné pro získání přehledu o vašem aktuálním využití.
[
{
"closeReason": 2,
"closeReasonText": "BrowserIdle",
"endTime": 1711621769485,
"sessionId": "478f4d7d-e943-40f6-a414-837d3736a1dc",
"startTime": 1711621703708
},
{
"closeReason": 1,
"closeReasonText": "NormalClosure",
"endTime": 1711123501771,
"sessionId": "2be00a21-9fb6-4bb2-9861-8cd48e40e771",
"startTime": 1711123430918
}
]Relace 2be00a21-9fb6-4bb2-9861-8cd48e40e771 byla výslovně uzavřena pomocí browser.close() klientem, zatímco relace 478f4d7d-e943-40f6-a414-837d3736a1dc byla uzavřena kvůli dosažení maximální doby nečinnosti (ověřte limity).
Tyto informace byste měli vidět i v dashboardu, i když s mírným zpožděním.
Aktivní limity
puppeteer.limits() zobrazí vaše aktivní limity:
{
"activeSessions": [
{ "id": "478f4d7d-e943-40f6-a414-837d3736a1dc" },
{ "id": "565e05fb-4d2a-402b-869b-5b65b1381db7" }
],
"allowedBrowserAcquisitions": 1,
"maxConcurrentSessions": 2,
"timeUntilNextAllowedBrowserAcquisition": 0
}activeSessionszobrazí ID aktuálně otevřených relacímaxConcurrentSessionsurčuje, kolik prohlížečů může být otevřeno současněallowedBrowserAcquisitionsurčuje, zda lze otevřít novou relaci prohlížeče podle limitu četnosti limity na místětimeUntilNextAllowedBrowserAcquisitionurčuje čekací dobu, než lze spustit nový prohlížeč.
Puppeteer API
Úplné API Puppeteer najdete v Fork knihovny Puppeteer od Cloudflare ↗.