diff --git a/package.json b/package.json index bd1ae72b..71c9a7c8 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "@apify/tsconfig": "^0.2.0", "@commitlint/config-conventional": "^21.2.0", "@isaacs/brace-expansion": "^5.0.1", - "@playwright/browser-chromium": "^1.62.1", + "@playwright/browser-chromium": "~1.61.1", "@types/fs-extra": "^11.0.4", "@types/node": "^24.13.3", "@types/semver": "^7.8.0", @@ -80,7 +80,7 @@ "oxfmt": "0.66.0", "oxlint": "1.80.0", "oxlint-tsgolint": "7.0.2001", - "playwright": "^1.62.1", + "playwright": "~1.61.1", "puppeteer": "25.4.0", "rimraf": "^6.1.3", "tsx": "^4.23.5", diff --git a/packages/actor-scraper/playwright-scraper/Dockerfile b/packages/actor-scraper/playwright-scraper/Dockerfile index 25699a60..9c02648d 100644 --- a/packages/actor-scraper/playwright-scraper/Dockerfile +++ b/packages/actor-scraper/playwright-scraper/Dockerfile @@ -2,9 +2,16 @@ # root pnpm-lock.yaml for a deterministic install. # # The base is pinned by digest (reproducible Chromium + OS deps). The actor pins playwright to the -# version this base ships (24-1.62.1 -> playwright 1.62.1) and bundles it, so the bundled driver +# version this base ships (24-1.61.1 -> playwright 1.61.1) and bundles it, so the bundled driver # matches the Chromium binary it drives. Renovate bumps the base digest and the playwright pin together. -FROM apify/actor-node-playwright:24-1.62.1@sha256:69172fc9daa6c6e7d3d1e57491c91852a0d6af2818378d341f65e69795e68ab4 AS builder +# +# HELD at 1.61.1 on purpose. playwright 1.62.0 stopped disabling Chromium's RenderDocument +# (microsoft/playwright#41303, Chromium 149 -> 151), which makes page.close() hang on pages that +# commit a second navigation: measured 11/30 on a single client-side redirect, 0/30 with the feature +# disabled. Crawlee then leaks the page and its BrowserController never recovers (apify/crawlee#1829). +# Do not move past 1.61.1 until microsoft/playwright#42068 ships (milestone v1.64) or crawlee's +# browser pool survives a close that never settles. +FROM apify/actor-node-playwright:24-1.61.1@sha256:ec39f7a735c35c3f78e450bf6833c1adcc0b6d0e132c0e4fd9010317a9d7a212 AS builder # The browser base runs as `myuser`; the build stage needs root for corepack + a writable workdir. USER root @@ -29,7 +36,7 @@ RUN pnpm --filter actor-playwright-scraper... build # into node_modules instead of symlinking it. RUN pnpm --config.inject-workspace-packages=true --filter actor-playwright-scraper deploy --prod /deploy -FROM apify/actor-node-playwright:24-1.62.1@sha256:69172fc9daa6c6e7d3d1e57491c91852a0d6af2818378d341f65e69795e68ab4 +FROM apify/actor-node-playwright:24-1.61.1@sha256:ec39f7a735c35c3f78e450bf6833c1adcc0b6d0e132c0e4fd9010317a9d7a212 # Base WORKDIR is /home/myuser and ships the browser plus the Xvfb entrypoint. Replace only the # template node_modules with the lean production bundle (which carries the matching playwright); the diff --git a/packages/actor-scraper/playwright-scraper/package.json b/packages/actor-scraper/playwright-scraper/package.json index 84cb4c69..33620316 100644 --- a/packages/actor-scraper/playwright-scraper/package.json +++ b/packages/actor-scraper/playwright-scraper/package.json @@ -11,7 +11,7 @@ "@crawlee/utils": "^3.18.0", "apify": "^3.7.2", "idcac-playwright": "^0.2.0", - "playwright": "1.62.1" + "playwright": "1.61.1" }, "devDependencies": { "@apify/tsconfig": "^0.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c667121d..aea24383 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -238,8 +238,8 @@ importers: specifier: ^5.0.1 version: 5.0.1 '@playwright/browser-chromium': - specifier: ^1.62.1 - version: 1.62.1 + specifier: ~1.61.1 + version: 1.61.1 '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 @@ -266,7 +266,7 @@ importers: version: 21.2.2(@types/node@24.13.3)(conventional-commits-filter@6.0.1)(conventional-commits-parser@7.1.2)(typescript@6.0.3) crawlee: specifier: ^3.18.0 - version: 3.18.1(@types/node@24.13.3)(idcac-playwright@0.2.0)(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) + version: 3.18.1(@types/node@24.13.3)(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) fs-extra: specifier: ^11.4.0 version: 11.4.0 @@ -295,8 +295,8 @@ importers: specifier: 7.0.2001 version: 7.0.2001 playwright: - specifier: ^1.62.1 - version: 1.62.1 + specifier: ~1.61.1 + version: 1.61.1 puppeteer: specifier: 25.4.0 version: 25.4.0 @@ -428,7 +428,7 @@ importers: version: 3.18.1(supports-color@7.2.0) '@crawlee/playwright': specifier: ^3.18.0 - version: 3.18.1(idcac-playwright@0.2.0)(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) + version: 3.18.1(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) '@crawlee/utils': specifier: ^3.18.0 version: 3.18.1(supports-color@7.2.0) @@ -439,8 +439,8 @@ importers: specifier: ^0.2.0 version: 0.2.0 playwright: - specifier: 1.62.1 - version: 1.62.1 + specifier: 1.61.1 + version: 1.61.1 devDependencies: '@apify/tsconfig': specifier: ^0.2.0 @@ -462,7 +462,7 @@ importers: version: link:../../scraper-tools '@crawlee/puppeteer': specifier: ^3.18.0 - version: 3.18.1(idcac-playwright@0.2.0)(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) + version: 3.18.1(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) apify: specifier: ^3.7.2 version: 3.7.2(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) @@ -530,7 +530,7 @@ importers: version: link:../../scraper-tools '@crawlee/puppeteer': specifier: ^3.18.0 - version: 3.18.1(idcac-playwright@0.2.0)(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) + version: 3.18.1(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) apify: specifier: ^3.7.2 version: 3.7.2(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) @@ -577,7 +577,7 @@ importers: devDependencies: '@crawlee/browser-pool': specifier: ^3.18.0 - version: 3.18.1(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) + version: 3.18.1(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) '@crawlee/core': specifier: ^3.18.0 version: 3.18.1(supports-color@7.2.0) @@ -1784,9 +1784,9 @@ packages: cpu: [x64] os: [win32] - '@playwright/browser-chromium@1.62.1': - resolution: {integrity: sha512-DU/t4TSqHvAc+uFMt972forQYqBTh/ul7lZ8U81HYGyxnf6vSPPz9NzuE0OR3x/elqvvGm+n4gcny+QSKT+FDw==} - engines: {node: '>=20'} + '@playwright/browser-chromium@1.61.1': + resolution: {integrity: sha512-t3/zE0i9gik5R/NpRs7G2Xo/6NPeABW6ReplGdtkeWeAkaV764CgFgoKjJo21D2xgjnvDvRYubqBUu4xl0VCqA==} + engines: {node: '>=18'} '@puppeteer/browsers@3.0.6': resolution: {integrity: sha512-B/gKoqlFkzhvzsI6jo9K1cZz9o5ypviVv/xu8CwA4grZzyVwN+XfkT+tu8T1zrauuEXv6VhS2oGX+6NL95WcKA==} @@ -4228,9 +4228,9 @@ packages: engines: {node: '>=18'} hasBin: true - playwright-core@1.62.1: - resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} - engines: {node: '>=20'} + playwright-core@1.61.1: + resolution: {integrity: sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==} + engines: {node: '>=18'} hasBin: true playwright@1.59.1: @@ -4238,9 +4238,9 @@ packages: engines: {node: '>=18'} hasBin: true - playwright@1.62.1: - resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} - engines: {node: '>=20'} + playwright@1.61.1: + resolution: {integrity: sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==} + engines: {node: '>=18'} hasBin: true postcss-selector-parser@7.1.4: @@ -5414,14 +5414,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/browser-pool@3.18.1(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0)': + '@crawlee/browser-pool@3.18.1(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0)': dependencies: '@apify/log': 2.5.53 '@apify/timeout': 0.4.8 '@crawlee/core': 3.18.1(supports-color@7.2.0) '@crawlee/types': 3.18.1 fingerprint-generator: 2.1.87 - fingerprint-injector: 2.1.87(playwright@1.62.1)(puppeteer@25.4.0) + fingerprint-injector: 2.1.87(playwright@1.61.1)(puppeteer@25.4.0) lodash.merge: 4.6.2 nanoid: 3.3.17 ow: 0.28.2 @@ -5431,7 +5431,7 @@ snapshots: tiny-typed-emitter: 2.1.0 tslib: 2.8.1 optionalDependencies: - playwright: 1.62.1 + playwright: 1.61.1 puppeteer: 25.4.0 transitivePeerDependencies: - supports-color @@ -5452,18 +5452,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@crawlee/browser@3.18.1(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0)': + '@crawlee/browser@3.18.1(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0)': dependencies: '@apify/timeout': 0.4.8 '@crawlee/basic': 3.18.1(supports-color@7.2.0) - '@crawlee/browser-pool': 3.18.1(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) + '@crawlee/browser-pool': 3.18.1(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) '@crawlee/types': 3.18.1 '@crawlee/utils': 3.18.1(supports-color@7.2.0) ow: 0.28.2 tslib: 2.8.1 type-fest: 4.41.0 optionalDependencies: - playwright: 1.62.1 + playwright: 1.61.1 puppeteer: 25.4.0 transitivePeerDependencies: - supports-color @@ -5693,13 +5693,13 @@ snapshots: - puppeteer - supports-color - '@crawlee/playwright@3.18.1(idcac-playwright@0.2.0)(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0)': + '@crawlee/playwright@3.18.1(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0)': dependencies: '@apify/datastructures': 2.0.6 '@apify/log': 2.5.53 '@apify/timeout': 0.4.8 - '@crawlee/browser': 3.18.1(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) - '@crawlee/browser-pool': 3.18.1(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) + '@crawlee/browser': 3.18.1(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) + '@crawlee/browser-pool': 3.18.1(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) '@crawlee/core': 3.18.1(supports-color@7.2.0) '@crawlee/types': 3.18.1 '@crawlee/utils': 3.18.1(supports-color@7.2.0) @@ -5714,17 +5714,17 @@ snapshots: type-fest: 4.41.0 optionalDependencies: idcac-playwright: 0.2.0 - playwright: 1.62.1 + playwright: 1.61.1 transitivePeerDependencies: - puppeteer - supports-color - '@crawlee/puppeteer@3.18.1(idcac-playwright@0.2.0)(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0)': + '@crawlee/puppeteer@3.18.1(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0)': dependencies: '@apify/datastructures': 2.0.6 '@apify/log': 2.5.53 - '@crawlee/browser': 3.18.1(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) - '@crawlee/browser-pool': 3.18.1(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) + '@crawlee/browser': 3.18.1(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) + '@crawlee/browser-pool': 3.18.1(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) '@crawlee/types': 3.18.1 '@crawlee/utils': 3.18.1(supports-color@7.2.0) cheerio: 1.0.0-rc.12 @@ -6504,9 +6504,9 @@ snapshots: '@oxlint/binding-win32-x64-msvc@1.80.0': optional: true - '@playwright/browser-chromium@1.62.1': + '@playwright/browser-chromium@1.61.1': dependencies: - playwright-core: 1.62.1 + playwright-core: 1.61.1 '@puppeteer/browsers@3.0.6': dependencies: @@ -7305,11 +7305,11 @@ snapshots: optionalDependencies: typescript: 6.0.3 - crawlee@3.18.1(@types/node@24.13.3)(idcac-playwright@0.2.0)(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0): + crawlee@3.18.1(@types/node@24.13.3)(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0): dependencies: '@crawlee/basic': 3.18.1(supports-color@7.2.0) - '@crawlee/browser': 3.18.1(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) - '@crawlee/browser-pool': 3.18.1(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) + '@crawlee/browser': 3.18.1(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) + '@crawlee/browser-pool': 3.18.1(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) '@crawlee/cheerio': 3.18.1(supports-color@7.2.0) '@crawlee/cli': 3.18.1(@types/node@24.13.3) '@crawlee/core': 3.18.1(supports-color@7.2.0) @@ -7317,14 +7317,14 @@ snapshots: '@crawlee/jsdom': 3.18.1(supports-color@7.2.0) '@crawlee/linkedom': 3.18.1(supports-color@7.2.0) '@crawlee/memory-storage': 3.18.1 - '@crawlee/playwright': 3.18.1(idcac-playwright@0.2.0)(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) - '@crawlee/puppeteer': 3.18.1(idcac-playwright@0.2.0)(playwright@1.62.1)(puppeteer@25.4.0)(supports-color@7.2.0) + '@crawlee/playwright': 3.18.1(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) + '@crawlee/puppeteer': 3.18.1(idcac-playwright@0.2.0)(playwright@1.61.1)(puppeteer@25.4.0)(supports-color@7.2.0) '@crawlee/utils': 3.18.1(supports-color@7.2.0) import-local: 3.2.0 tslib: 2.8.1 optionalDependencies: idcac-playwright: 0.2.0 - playwright: 1.62.1 + playwright: 1.61.1 puppeteer: 25.4.0 transitivePeerDependencies: - '@types/node' @@ -7751,12 +7751,12 @@ snapshots: playwright: 1.59.1 puppeteer: 25.4.0 - fingerprint-injector@2.1.87(playwright@1.62.1)(puppeteer@25.4.0): + fingerprint-injector@2.1.87(playwright@1.61.1)(puppeteer@25.4.0): dependencies: fingerprint-generator: 2.1.87 tslib: 2.8.1 optionalDependencies: - playwright: 1.62.1 + playwright: 1.61.1 puppeteer: 25.4.0 flat@5.0.2: {} @@ -9291,7 +9291,7 @@ snapshots: playwright-core@1.59.1: {} - playwright-core@1.62.1: {} + playwright-core@1.61.1: {} playwright@1.59.1: dependencies: @@ -9299,9 +9299,9 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - playwright@1.62.1: + playwright@1.61.1: dependencies: - playwright-core: 1.62.1 + playwright-core: 1.61.1 optionalDependencies: fsevents: 2.3.2 diff --git a/renovate.json b/renovate.json index c2e62ad7..61e42df6 100644 --- a/renovate.json +++ b/renovate.json @@ -76,6 +76,22 @@ ], "matchPackageNames": ["apify/actor-node-puppeteer-chrome", "puppeteer"], "groupName": "puppeteer browser stack" + }, + { + "description": "HELD at 1.61.x: playwright 1.62.0 stopped disabling Chromium's RenderDocument (microsoft/playwright#41303), which makes page.close() hang and leaks the page in Crawlee's browser pool (microsoft/playwright#42068, apify/crawlee#1829). Lift once upstream ships the fix or the pool survives a close that never settles.", + "matchManagers": ["npm"], + "matchFileNames": ["package.json", "packages/actor-scraper/playwright-scraper/package.json"], + "matchPackageNames": ["playwright", "@playwright/browser-chromium"], + "allowedVersions": "<1.62.0", + "automerge": false + }, + { + "description": "HELD at 1.61.x: keep the Playwright base image on the line matching the driver pin, see the rule above. Digest updates within the tag still flow.", + "matchManagers": ["dockerfile"], + "matchFileNames": ["packages/actor-scraper/playwright-scraper/Dockerfile"], + "matchPackageNames": ["apify/actor-node-playwright"], + "allowedVersions": "/^24-1\\.61\\./", + "automerge": false } ], "schedule": ["every weekday"]