graceful-playwright
v1.2.0
Published
Gracefully handle timeout and network error with auto retry.
Downloads
76
Maintainers
Readme
graceful-playwright
Gracefully handle timeout and network error with auto retry.
Features
auto retry when
page.goto()
timeout or encounteredERR_NETWORK_CHANGED
auto restart page when
page.goto()
crashed with/page crashed/i
errorhelper method to auto retry when failed with
The object has been collected to prevent unbounded heap growth
errorsupport restarting page from
Browser
orBrowserContext
instancesupport wrapping existing
Page
instanceproxy frequently used methods
create
Page
instance lazily (on-demand)
Installation
npm install graceful-playwright
You can install the package with yarn, pnpm or slnpm as well.
Usage Example
More usage examples see: example.ts and core.spec.ts
import { GracefulPage } from 'graceful-playwright'
let browser = await chromium.launch()
let page = new GracefulPage({ from: browser })
let lines: string[] = await page.autoRetryWhenFailed(async () => {
await page.goto('http://example.net')
return await page.evaluate(() =>
Array.from(document.querySelectorAll('a'), a => a.href),
)
})
console.log('lines:', lines)
await page.close()
await browser.close()
Typescript Signature
import { Browser, BrowserContext, Page, Response } from 'playwright'
export class GracefulPage {
constructor(
public options: {
from: Browser | BrowserContext
page?: Page | Promise<Page>
/**
* @default 5000 ms
*/
retryInterval?: number
/**
* @default error => console.error(error)
*/
onError?: (error: unknown) => void
},
)
fork(): GracefulPage
getPage(): Page | Promise<Page>
restart(options?: Parameters<Page['close']>[0]): Promise<Page>
/** @description optimized version of page.close() */
close: Page['close']
/** @description graceful version of page.goto() */
goto(
url: string,
/**
* @default { waitUtil: "domcontentloaded" }
*/
options?: Parameters<Page['goto']>[1],
): Promise<Response | null>
autoRetryWhenFailed<T>(f: () => T | Promise<T>): Promise<T>
/** @description proxy method to (await this.getPage())[method] */
evaluate: Page['evaluate']
waitForSelector: Page['waitForSelector']
fill: Page['fill']
click: Page['click']
content: Page['content']
title: Page['title']
innerHTML: Page['innerHTML']
innerText: Page['innerText']
}
License
This project is licensed with BSD-2-Clause
This is free, libre, and open-source software. It comes down to four essential freedoms [ref]:
- The freedom to run the program as you wish, for any purpose
- The freedom to study how the program works, and change it so it does your computing as you wish
- The freedom to redistribute copies so you can help others
- The freedom to distribute copies of your modified versions to others