|
| 1 | +--- |
| 2 | +title: Browser Rendering Playwright GA, Stagehand support (Beta), and higher limits |
| 3 | +description: Browser Rendering birthday week announcements |
| 4 | +products: |
| 5 | + - browser-rendering |
| 6 | +date: 2025-09-25T12:00:00Z |
| 7 | +--- |
| 8 | + |
| 9 | +We’re shipping three updates to Browser Rendering: |
| 10 | +- Playwright support is now Generally Available and synced with [Playwright v1.55](https://playwright.dev/docs/release-notes#version-155), giving you a stable foundation for critical automation and AI-agent workflows. |
| 11 | +- We’re also adding [Stagehand support (Beta)](/browser-rendering/platform/stagehand/) so you can combine code with natural language instructions to build more resilient automations. |
| 12 | +- Finally, we’ve tripled [limits](/browser-rendering/platform/limits/#workers-paid) for paid plans across both the [REST API](/browser-rendering/rest-api/) and [Workers Bindings](/browser-rendering/workers-bindings/) to help you scale. |
| 13 | + |
| 14 | +To get started with Stagehand, refer to the [Stagehand](/browser-rendering/platform/stagehand/) example that uses Stagehand and [Workers AI](/workers-ai/) to search for a movie on this [example movie directory](https://demo.playwright.dev/movies), extract its details using natural language (title, year, rating, duration, and genre), and return the information along with a screenshot of the webpage. |
| 15 | + |
| 16 | +```ts title="Stagehand example" |
| 17 | +const stagehand = new Stagehand({ |
| 18 | + env: "LOCAL", |
| 19 | + localBrowserLaunchOptions: { cdpUrl: endpointURLString(env.BROWSER) }, |
| 20 | + llmClient: new WorkersAIClient(env.AI), |
| 21 | + verbose: 1, |
| 22 | +}); |
| 23 | + |
| 24 | +await stagehand.init(); |
| 25 | +const page = stagehand.page; |
| 26 | + |
| 27 | +await page.goto('https://demo.playwright.dev/movies'); |
| 28 | + |
| 29 | +// if search is a multi-step action, stagehand will return an array of actions it needs to act on |
| 30 | +const actions = await page.observe('Search for "Furiosa"'); |
| 31 | +for (const action of actions) |
| 32 | + await page.act(action); |
| 33 | + |
| 34 | +await page.act('Click the search result'); |
| 35 | + |
| 36 | +// normal playwright functions work as expected |
| 37 | +await page.waitForSelector('.info-wrapper .cast'); |
| 38 | + |
| 39 | +let movieInfo = await page.extract({ |
| 40 | + instruction: 'Extract movie information', |
| 41 | + schema: z.object({ |
| 42 | + title: z.string(), |
| 43 | + year: z.number(), |
| 44 | + rating: z.number(), |
| 45 | + genres: z.array(z.string()), |
| 46 | + duration: z.number().describe("Duration in minutes"), |
| 47 | + }), |
| 48 | +}); |
| 49 | + |
| 50 | +await stagehand.close(); |
| 51 | +``` |
| 52 | + |
| 53 | + |
0 commit comments