{"id":23773411,"url":"https://github.com/beenotung/graceful-playwright","last_synced_at":"2026-03-11T11:03:48.386Z","repository":{"id":222704034,"uuid":"758177517","full_name":"beenotung/graceful-playwright","owner":"beenotung","description":"Gracefully handle timeout and network error with auto retry.","archived":false,"fork":false,"pushed_at":"2025-01-31T16:44:41.000Z","size":46,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-23T03:33:45.791Z","etag":null,"topics":["connection","crashed","error-handling","goto","graceful","network","playwright","retry","socket","typescript"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/graceful-playwright","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/beenotung.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-02-15T19:20:48.000Z","updated_at":"2025-01-31T16:44:45.000Z","dependencies_parsed_at":"2024-03-22T08:40:09.336Z","dependency_job_id":"9363727c-6dff-4d19-ac4c-87016826f9ee","html_url":"https://github.com/beenotung/graceful-playwright","commit_stats":null,"previous_names":["beenotung/graceful-playwright"],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beenotung%2Fgraceful-playwright","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beenotung%2Fgraceful-playwright/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beenotung%2Fgraceful-playwright/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beenotung%2Fgraceful-playwright/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beenotung","download_url":"https://codeload.github.com/beenotung/graceful-playwright/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248455854,"owners_count":21106597,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["connection","crashed","error-handling","goto","graceful","network","playwright","retry","socket","typescript"],"created_at":"2025-01-01T05:39:48.626Z","updated_at":"2026-03-11T11:03:43.366Z","avatar_url":"https://github.com/beenotung.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# graceful-playwright\n\nGracefully handle timeout and network error with auto retry.\n\n[![npm Package Version](https://img.shields.io/npm/v/graceful-playwright)](https://www.npmjs.com/package/graceful-playwright)\n\n## Features\n\n- auto retry when `page.goto()` timeout or encountered `ERR_NETWORK_CHANGED`\n\n- auto restart page when `page.goto()` crashed with `/page crashed/i` error\n\n- helper method to auto retry when failed with `The object has been collected to prevent unbounded heap growth` error\n\n- support restarting page from `Browser` or `BrowserContext` instance\n\n- support wrapping existing `Page` instance\n\n- proxy frequently used methods\n\n- create `Page` instance lazily (on-demand)\n\n## Installation\n\n```bash\nnpm install graceful-playwright\n```\n\nYou can install the package with yarn, pnpm or slnpm as well.\n\n## Usage Example\n\nMore usage examples see: [example.ts](./example.ts) and [core.spec.ts](./core.spec.ts)\n\n```typescript\nimport { GracefulPage } from 'graceful-playwright'\n\nlet browser = await chromium.launch()\nlet page = new GracefulPage({ from: browser })\n\nlet lines: string[] = await page.autoRetryWhenFailed(async () =\u003e {\n  await page.goto('http://example.net')\n  return await page.evaluate(() =\u003e\n    Array.from(document.querySelectorAll('a'), a =\u003e a.href),\n  )\n})\nconsole.log('lines:', lines)\n\nawait page.close()\nawait browser.close()\n```\n\n## Typescript Signature\n\nMain Class: `GracefulPage`\n\n```typescript\nimport { Browser, BrowserContext, Page, Response } from 'playwright'\n\nexport class GracefulPage {\n  constructor(\n    public options: {\n      from: Browser | BrowserContext\n      page?: Page | Promise\u003cPage\u003e\n      /**\n       * @default 5000 ms\n       */\n      retryInterval?: number\n      /**\n       * @default error =\u003e console.error(error)\n       */\n      onError?: (error: unknown) =\u003e void\n    },\n  )\n\n  fork(): GracefulPage\n\n  getPage(): Page | Promise\u003cPage\u003e\n\n  restart(options?: Parameters\u003cPage['close']\u003e[0]): Promise\u003cPage\u003e\n\n  /** @description optimized version of page.close() */\n  close: Page['close']\n\n  /**\n   * @description graceful version of page.goto()\n   * @throws GotoError with response details when got 429 Too Many Requests without retry-after header\n   */\n  goto(\n    url: string,\n    /**\n     * @default { waitUtil: \"domcontentloaded\" }\n     */\n    options?: Parameters\u003cPage['goto']\u003e[1],\n  ): Promise\u003cResponse | null\u003e\n\n  autoRetryWhenFailed\u003cT\u003e(f: () =\u003e T | Promise\u003cT\u003e): Promise\u003cT\u003e\n\n  /** @description proxy method to (await this.getPage())[method] */\n  evaluate: Page['evaluate']\n  waitForSelector: Page['waitForSelector']\n  fill: Page['fill']\n  click: Page['click']\n  content: Page['content']\n  title: Page['title']\n  innerHTML: Page['innerHTML']\n  innerText: Page['innerText']\n}\n```\n\nError Class: `GotoError`\n\n```typescript\nexport class GotoError extends Error {\n  constructor(message: string, public details: GotoErrorDetails)\n}\n\nexport type GotoErrorDetails = {\n  url: string\n  options?: Parameters\u003cPage['goto']\u003e[1]\n  response: Awaited\u003cReturnType\u003cPage['goto']\u003e\u003e\n}\n```\n\n## License\n\nThis project is licensed with [BSD-2-Clause](./LICENSE)\n\nThis is free, libre, and open-source software. It comes down to four essential freedoms [[ref]](https://seirdy.one/2021/01/27/whatsapp-and-the-domestication-of-users.html#fnref:2):\n\n- The freedom to run the program as you wish, for any purpose\n- The freedom to study how the program works, and change it so it does your computing as you wish\n- The freedom to redistribute copies so you can help others\n- The freedom to distribute copies of your modified versions to others\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeenotung%2Fgraceful-playwright","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeenotung%2Fgraceful-playwright","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeenotung%2Fgraceful-playwright/lists"}