
Playwright Automation in TypeScript: Reusable Patterns for Screenshot, PDF, and Scraping
Every browser automation project starts the same way. You open a browser, navigate to a URL, and immediately realize you need retry logic, stealth mode, and session persistence before writing any actual automation. Here are the TypeScript patterns I reach for every time. Core Browser Factory export async function withPage < T > ( config : BrowserConfig , fn : ( page : Page ) => Promise < T > ): Promise < T > { const browser = await createBrowser ( config ); const context = await createContext ( browser , config ); const page = await context . newPage (); try { return await fn ( page ); } finally { await browser . close (); } } Stealth patch that most tutorials skip: await context . addInitScript (() => { Object . defineProperty ( navigator , ' webdriver ' , { get : () => undefined }); Object . defineProperty ( navigator , ' plugins ' , { get : () => [ 1 , 2 , 3 , 4 , 5 ] }); }); Without this, headless Chrome is trivially detectable. Screenshot with Element Selection // Full page const
Continue reading on Dev.to Webdev
Opens in a new tab




