From 36347e7feac4044f3fa1d159f9a4d74489a25246 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Sun, 27 Aug 2023 07:24:35 -0700 Subject: [PATCH] feat: make `playwright` package not install browsers automatically (#26672) Additionally introduce `@playwright/browser-` packages that just download the respective browser, but do not export anything. References #26614. --- docs/src/browsers.md | 45 +------ docs/src/library-js.md | 111 +++++++++++++++++- package-lock.json | 67 ++++++++++- .../playwright-browser-chromium/README.md | 3 + .../playwright-browser-chromium/index.d.ts | 17 +++ packages/playwright-browser-chromium/index.js | 15 +++ .../playwright-browser-chromium/index.mjs | 15 +++ .../playwright-browser-chromium/install.js | 27 +++++ .../playwright-browser-chromium/package.json | 29 +++++ packages/playwright-browser-firefox/README.md | 3 + .../playwright-browser-firefox/index.d.ts | 17 +++ packages/playwright-browser-firefox/index.js | 15 +++ packages/playwright-browser-firefox/index.mjs | 15 +++ .../playwright-browser-firefox/install.js | 27 +++++ .../playwright-browser-firefox/package.json | 29 +++++ packages/playwright-browser-webkit/README.md | 3 + packages/playwright-browser-webkit/index.d.ts | 17 +++ packages/playwright-browser-webkit/index.js | 15 +++ packages/playwright-browser-webkit/index.mjs | 15 +++ .../install.js | 4 +- .../playwright-browser-webkit/package.json | 29 +++++ packages/playwright/package.json | 1 - tests/installation/android-types.spec.ts | 2 +- tests/installation/driver-should-work.spec.ts | 4 +- tests/installation/electron-types.spec.ts | 2 +- .../fixture-scripts/browser-only.js | 27 +++++ tests/installation/fixture-scripts/sanity.js | 15 +-- .../fixture-scripts/screencast.js | 11 +- tests/installation/globalSetup.ts | 3 + .../npm-installs-local-packages.spec.ts | 2 +- tests/installation/npx-global-install.spec.ts | 1 + ...laywright-cdn-failover-should-work.spec.ts | 5 +- ...right-cdn-should-race-with-timeout.spec.ts | 3 +- .../playwright-cli-codegen.spec.ts | 1 + ...install-should-work-with-languages.spec.ts | 2 +- ...playwright-cli-install-should-work.spec.ts | 8 +- ...ywright-cli-screenshot-should-work.spec.ts | 1 + .../playwright-electron-should-work.spec.ts | 2 +- ...-global-installation-cross-package.spec.ts | 4 +- .../playwright-global-installation.spec.ts | 13 +- ...ywright-global-subsequent-installs.spec.ts | 4 +- ...d-work-with-relative-browsers-path.spec.ts | 3 +- ...hould-work-with-relative-home-path.spec.ts | 2 +- .../playwright-should-work.spec.ts | 11 +- .../playwright-test-should-work.spec.ts | 2 +- .../playwright-xyz-should-work.spec.ts | 28 ++++- tests/installation/screencast.spec.ts | 8 +- ...oad-inspect-with-custom-executable.spec.ts | 2 +- .../skip-browser-download.spec.ts | 2 +- .../validate-dependencies.spec.ts | 2 + utils/workspace.js | 15 +++ 51 files changed, 589 insertions(+), 115 deletions(-) create mode 100644 packages/playwright-browser-chromium/README.md create mode 100644 packages/playwright-browser-chromium/index.d.ts create mode 100644 packages/playwright-browser-chromium/index.js create mode 100644 packages/playwright-browser-chromium/index.mjs create mode 100644 packages/playwright-browser-chromium/install.js create mode 100644 packages/playwright-browser-chromium/package.json create mode 100644 packages/playwright-browser-firefox/README.md create mode 100644 packages/playwright-browser-firefox/index.d.ts create mode 100644 packages/playwright-browser-firefox/index.js create mode 100644 packages/playwright-browser-firefox/index.mjs create mode 100644 packages/playwright-browser-firefox/install.js create mode 100644 packages/playwright-browser-firefox/package.json create mode 100644 packages/playwright-browser-webkit/README.md create mode 100644 packages/playwright-browser-webkit/index.d.ts create mode 100644 packages/playwright-browser-webkit/index.js create mode 100644 packages/playwright-browser-webkit/index.mjs rename packages/{playwright => playwright-browser-webkit}/install.js (87%) create mode 100644 packages/playwright-browser-webkit/package.json create mode 100644 tests/installation/fixture-scripts/browser-only.js diff --git a/docs/src/browsers.md b/docs/src/browsers.md index bf83ad8af3..526fce5f06 100644 --- a/docs/src/browsers.md +++ b/docs/src/browsers.md @@ -468,31 +468,17 @@ Sometimes companies maintain an internal proxy that blocks direct access to the resources. In this case, Playwright can be configured to download browsers via a proxy server. ```bash tab=bash-bash lang=js -# For Playwright Test HTTPS_PROXY=https://192.0.2.1 npx playwright install - -# For Playwright Library -HTTPS_PROXY=https://192.0.2.1 npm install playwright ``` ```batch tab=bash-batch lang=js -# For Playwright Test set HTTPS_PROXY=https://192.0.2.1 npx playwright install - -# For Playwright Library -set HTTPS_PROXY=https://192.0.2.1 -npm install playwright ``` ```powershell tab=bash-powershell lang=js -# For Playwright Test $Env:HTTPS_PROXY="https://192.0.2.1" npx playwright install - -# For Playwright Library -$Env:HTTPS_PROXY="https://192.0.2.1" -npm install playwright ``` ```bash tab=bash-bash lang=python @@ -614,6 +600,7 @@ pwsh bin/Debug/netX/playwright.ps1 install $Env:PLAYWRIGHT_DOWNLOAD_CONNECTION_TIMEOUT="120000" pwsh bin/Debug/netX/playwright.ps1 install ``` + ## Download from artifact repository By default, Playwright downloads browsers from Microsoft's CDN. @@ -623,31 +610,17 @@ binaries. In this case, Playwright can be configured to download from a custom location using the `PLAYWRIGHT_DOWNLOAD_HOST` env variable. ```bash tab=bash-bash lang=js -# For Playwright Test PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 npx playwright install - -# For Playwright Library -PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 npm install playwright ``` ```batch tab=bash-batch lang=js -# For Playwright Test set PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 npx playwright install - -# For Playwright Library -set PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 -npm install playwright ``` ```powershell tab=bash-powershell lang=js -# For Playwright Test $Env:PLAYWRIGHT_DOWNLOAD_HOST="192.0.2.1" npx playwright install - -# For Playwright Library -$Env:PLAYWRIGHT_DOWNLOAD_HOST="192.0.2.1" -npm install playwright ``` ```bash tab=bash-bash lang=python @@ -699,35 +672,19 @@ It is also possible to use a per-browser download hosts using `PLAYWRIGHT_CHROMI take precedence over `PLAYWRIGHT_DOWNLOAD_HOST`. ```bash tab=bash-bash lang=js -# For Playwright Test PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST=203.0.113.3 PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 npx playwright install - -# For Playwright Library -PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST=203.0.113.3 PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 npm install playwright ``` ```batch tab=bash-batch lang=js -# For Playwright Test set PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST=203.0.113.3 set PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 npx playwright install - -# For Playwright Library -set PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST=203.0.113.3 -set PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 -npm install playwright ``` ```powershell tab=bash-powershell lang=js -# For Playwright Test $Env:PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST="203.0.113.3" $Env:PLAYWRIGHT_DOWNLOAD_HOST="192.0.2.1" npx playwright install - -# For Playwright Library -$Env:PLAYWRIGHT_FIREFOX_DOWNLOAD_HOST="203.0.113.3" -$Env:PLAYWRIGHT_DOWNLOAD_HOST="192.0.2.1" -npm install playwright ``` ```bash tab=bash-bash lang=python diff --git a/docs/src/library-js.md b/docs/src/library-js.md index d85c28c1ac..29ace98ba3 100644 --- a/docs/src/library-js.md +++ b/docs/src/library-js.md @@ -99,8 +99,8 @@ The key differences to note are as follows: | | Library | Test | | - | - | - | | Installation | `npm install playwright` | `npm init playwright@latest` - note `install` vs. `init` | -| Install browsers | Chromium, Firefox, WebKit are installed by default | `npx playwright install` or `npx playwright install chromium` for a single one | -| `import`/`require` name | `playwright` | `@playwright/test` | +| Install browsers | Install `@playwright/browser-chromium`, `@playwright/browser-firefox` and/or `@playwright/browser-webkit` | `npx playwright install` or `npx playwright install chromium` for a single one | +| `import` from | `playwright` | `@playwright/test` | | Initialization | Explicitly need to:
  1. Pick a browser to use, e.g. `chromium`
  2. Launch browser with [`method: BrowserType.launch`]
  3. Create a context with [`method: Browser.newContext`], and pass any context options explicitly, e.g. `devices['iPhone 11']`
  4. Create a page with [`method: BrowserContext.newPage`]
| An isolated `page` and `context` are provided to each test out-of the box, along with other [built-in fixtures](./test-fixtures.md#built-in-fixtures). No explicit creation. If referenced by the test in it's arguments, the Test Runner will create them for the test. (i.e. lazy-initialization) | | Assertions | No built-in Web-First Assertions | [Web-First assertions](./test-assertions.md) like: which auto-wait and retry for the condition to be met.| | Cleanup | Explicitly need to:
  1. Close context with [`method: BrowserContext.close`]
  2. Close browser with [`method: Browser.close`]
| No explicit close of [built-in fixtures](./test-fixtures.md#built-in-fixtures); the Test Runner will take care of it. @@ -124,9 +124,19 @@ Use npm or Yarn to install Playwright library in your Node.js project. See [syst npm i -D playwright ``` -This single command downloads the Playwright NPM package and browser binaries for Chromium, Firefox and WebKit. To modify this behavior see [managing browsers](./browsers.md#managing-browser-binaries). +You will also need to install browsers - either manually or by adding a package that will do it for you automatically. -Once installed, you can `require` Playwright in a Node.js script, and launch any of the 3 browsers (`chromium`, `firefox` and `webkit`). +```bash +# Download the Chromium, Firefox and WebKit browser +npx playwright install chromium firefox webkit + +# Alternatively, add packages that will download a browser upon npm install +npm i -D @playwright/browser-chromium @playwright/browser-firefox @playwright/browser-webkit +``` + +See [managing browsers](./browsers.md#managing-browser-binaries) for more options. + +Once installed, you can import Playwright in a Node.js script, and launch any of the 3 browsers (`chromium`, `firefox` and `webkit`). ```js const { chromium } = require('playwright'); @@ -179,25 +189,114 @@ npx playwright codegen wikipedia.org ## Browser downloads -By default, `playwright` automatically downloads Chromium, Firefox and WebKit during package installation. +To download Playwright browsers run: + +```bash +# Explicitly download browsers +npx playwright install +``` + +Alternatively, you can add `@playwright/browser-chromium`, `@playwright/browser-firefox` and `@playwright/browser-webkit` packages to automatically download the respective browser during the package installation. + +```bash +# Use a helper package that downloads a browser on npm install +npm install @playwright/browser-chromium +``` + +**Download behind a firewall or a proxy** + +Pass `HTTPS_PROXY` environment variable to download through a proxy. + +```bash tab=bash-bash lang=js +# Manual +HTTPS_PROXY=https://192.0.2.1 npx playwright install + +# Through @playwright/browser-chromium, @playwright/browser-firefox +# and @playwright/browser-webkit helper packages +HTTPS_PROXY=https://192.0.2.1 npm install +``` + +```batch tab=bash-batch lang=js +# Manual +set HTTPS_PROXY=https://192.0.2.1 +npx playwright install + +# Through @playwright/browser-chromium, @playwright/browser-firefox +# and @playwright/browser-webkit helper packages +set HTTPS_PROXY=https://192.0.2.1 +npm install +``` + +```powershell tab=bash-powershell lang=js +# Manual +$Env:HTTPS_PROXY=https://192.0.2.1 +npx playwright install + +# Through @playwright/browser-chromium, @playwright/browser-firefox +# and @playwright/browser-webkit helper packages +$Env:HTTPS_PROXY=https://192.0.2.1 +npm install +``` + +**Download from artifact repository** + +By default, Playwright downloads browsers from Microsoft's CDN. Pass `PLAYWRIGHT_DOWNLOAD_HOST` environment variable to download from an internal artifacts repository instead. + +```bash tab=bash-bash lang=js +# Manual +PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 npx playwright install + +# Through @playwright/browser-chromium, @playwright/browser-firefox +# and @playwright/browser-webkit helper packages +PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 npm install +``` + +```batch tab=bash-batch lang=js +# Manual +set PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 +npx playwright install + +# Through @playwright/browser-chromium, @playwright/browser-firefox +# and @playwright/browser-webkit helper packages +set PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 +npm install +``` + +```powershell tab=bash-powershell lang=js +# Manual +$Env:PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 +npx playwright install + +# Through @playwright/browser-chromium, @playwright/browser-firefox +# and @playwright/browser-webkit helper packages +$Env:PLAYWRIGHT_DOWNLOAD_HOST=192.0.2.1 +npm install +``` + +**Skip browser download** In certain cases, it is desired to avoid browser downloads altogether because browser binaries are managed separately. This can be done by setting `PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD` variable before installing packages. ```bash tab=bash-bash lang=js +# When using @playwright/browser-chromium, @playwright/browser-firefox +# and @playwright/browser-webkit helper packages PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ``` ```batch tab=bash-batch lang=js +# When using @playwright/browser-chromium, @playwright/browser-firefox +# and @playwright/browser-webkit helper packages set PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ``` ```powershell tab=bash-powershell lang=js +# When using @playwright/browser-chromium, @playwright/browser-firefox +# and @playwright/browser-webkit helper packages $Env:PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm install ``` - ## TypeScript support Playwright includes built-in support for TypeScript. Type definitions will be imported automatically. It is recommended to use type-checking to improve the IDE experience. diff --git a/package-lock.json b/package-lock.json index 7f26e86342..1c01f7dc6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1396,6 +1396,18 @@ "node": ">= 8" } }, + "node_modules/@playwright/browser-chromium": { + "resolved": "packages/playwright-browser-chromium", + "link": true + }, + "node_modules/@playwright/browser-firefox": { + "resolved": "packages/playwright-browser-firefox", + "link": true + }, + "node_modules/@playwright/browser-webkit": { + "resolved": "packages/playwright-browser-webkit", + "link": true + }, "node_modules/@playwright/experimental-ct-core": { "resolved": "packages/playwright-ct-core", "link": true @@ -6278,7 +6290,6 @@ }, "packages/playwright": { "version": "1.38.0-next", - "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "playwright-core": "1.38.0-next" @@ -6290,6 +6301,42 @@ "node": ">=16" } }, + "packages/playwright-browser-chromium": { + "name": "@playwright/browser-chromium", + "version": "1.38.0-next", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.38.0-next" + }, + "engines": { + "node": ">=16" + } + }, + "packages/playwright-browser-firefox": { + "name": "@playwright/browser-firefox", + "version": "1.38.0-next", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.38.0-next" + }, + "engines": { + "node": ">=16" + } + }, + "packages/playwright-browser-webkit": { + "name": "@playwright/browser-webkit", + "version": "1.38.0-next", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.38.0-next" + }, + "engines": { + "node": ">=16" + } + }, "packages/playwright-chromium": { "version": "1.38.0-next", "hasInstallScript": true, @@ -7402,6 +7449,24 @@ "fastq": "^1.6.0" } }, + "@playwright/browser-chromium": { + "version": "file:packages/playwright-browser-chromium", + "requires": { + "playwright-core": "1.38.0-next" + } + }, + "@playwright/browser-firefox": { + "version": "file:packages/playwright-browser-firefox", + "requires": { + "playwright-core": "1.38.0-next" + } + }, + "@playwright/browser-webkit": { + "version": "file:packages/playwright-browser-webkit", + "requires": { + "playwright-core": "1.38.0-next" + } + }, "@playwright/experimental-ct-core": { "version": "file:packages/playwright-ct-core", "requires": { diff --git a/packages/playwright-browser-chromium/README.md b/packages/playwright-browser-chromium/README.md new file mode 100644 index 0000000000..03e8c5de08 --- /dev/null +++ b/packages/playwright-browser-chromium/README.md @@ -0,0 +1,3 @@ +# @playwright/browser-chromium + +This package automatically installs [Chromium](https://www.chromium.org/) browser for [Playwright](http://github.com/microsoft/playwright) library. If you want to write end-to-end tests, we recommend [@playwright/test](https://playwright.dev/docs/intro). diff --git a/packages/playwright-browser-chromium/index.d.ts b/packages/playwright-browser-chromium/index.d.ts new file mode 100644 index 0000000000..89d098eaca --- /dev/null +++ b/packages/playwright-browser-chromium/index.d.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export {}; diff --git a/packages/playwright-browser-chromium/index.js b/packages/playwright-browser-chromium/index.js new file mode 100644 index 0000000000..c391f5c267 --- /dev/null +++ b/packages/playwright-browser-chromium/index.js @@ -0,0 +1,15 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/packages/playwright-browser-chromium/index.mjs b/packages/playwright-browser-chromium/index.mjs new file mode 100644 index 0000000000..c391f5c267 --- /dev/null +++ b/packages/playwright-browser-chromium/index.mjs @@ -0,0 +1,15 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/packages/playwright-browser-chromium/install.js b/packages/playwright-browser-chromium/install.js new file mode 100644 index 0000000000..8ceef68b95 --- /dev/null +++ b/packages/playwright-browser-chromium/install.js @@ -0,0 +1,27 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let install; + +try { + if (!require('playwright-core/lib/utils').isLikelyNpxGlobal()) + install = require('playwright-core/lib/server').installBrowsersForNpmInstall; +} catch (e) { + // Dev build, don't install browsers by default. +} + +if (install) + install(['chromium', 'ffmpeg']); diff --git a/packages/playwright-browser-chromium/package.json b/packages/playwright-browser-chromium/package.json new file mode 100644 index 0000000000..793eeecee4 --- /dev/null +++ b/packages/playwright-browser-chromium/package.json @@ -0,0 +1,29 @@ +{ + "name": "@playwright/browser-chromium", + "version": "1.38.0-next", + "description": "Playwright package that automatically installs Chromium", + "repository": "github:Microsoft/playwright", + "homepage": "https://playwright.dev", + "engines": { + "node": ">=16" + }, + "author": { + "name": "Microsoft Corporation" + }, + "license": "Apache-2.0", + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./index.mjs", + "require": "./index.js", + "default": "./index.js" + }, + "./package.json": "./package.json" + }, + "scripts": { + "install": "node install.js" + }, + "dependencies": { + "playwright-core": "1.38.0-next" + } +} diff --git a/packages/playwright-browser-firefox/README.md b/packages/playwright-browser-firefox/README.md new file mode 100644 index 0000000000..38bc7cb03f --- /dev/null +++ b/packages/playwright-browser-firefox/README.md @@ -0,0 +1,3 @@ +# @playwright/browser-firefox + +This package automatically installs [Firefox](https://www.mozilla.org/firefox/) browser for [Playwright](http://github.com/microsoft/playwright) library. If you want to write end-to-end tests, we recommend [@playwright/test](https://playwright.dev/docs/intro). diff --git a/packages/playwright-browser-firefox/index.d.ts b/packages/playwright-browser-firefox/index.d.ts new file mode 100644 index 0000000000..89d098eaca --- /dev/null +++ b/packages/playwright-browser-firefox/index.d.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export {}; diff --git a/packages/playwright-browser-firefox/index.js b/packages/playwright-browser-firefox/index.js new file mode 100644 index 0000000000..c391f5c267 --- /dev/null +++ b/packages/playwright-browser-firefox/index.js @@ -0,0 +1,15 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/packages/playwright-browser-firefox/index.mjs b/packages/playwright-browser-firefox/index.mjs new file mode 100644 index 0000000000..c391f5c267 --- /dev/null +++ b/packages/playwright-browser-firefox/index.mjs @@ -0,0 +1,15 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/packages/playwright-browser-firefox/install.js b/packages/playwright-browser-firefox/install.js new file mode 100644 index 0000000000..a917664fc0 --- /dev/null +++ b/packages/playwright-browser-firefox/install.js @@ -0,0 +1,27 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +let install; + +try { + if (!require('playwright-core/lib/utils').isLikelyNpxGlobal()) + install = require('playwright-core/lib/server').installBrowsersForNpmInstall; +} catch (e) { + // Dev build, don't install browsers by default. +} + +if (install) + install(['firefox']); diff --git a/packages/playwright-browser-firefox/package.json b/packages/playwright-browser-firefox/package.json new file mode 100644 index 0000000000..3695ba72a9 --- /dev/null +++ b/packages/playwright-browser-firefox/package.json @@ -0,0 +1,29 @@ +{ + "name": "@playwright/browser-firefox", + "version": "1.38.0-next", + "description": "Playwright package that automatically installs Firefox", + "repository": "github:Microsoft/playwright", + "homepage": "https://playwright.dev", + "engines": { + "node": ">=16" + }, + "author": { + "name": "Microsoft Corporation" + }, + "license": "Apache-2.0", + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./index.mjs", + "require": "./index.js", + "default": "./index.js" + }, + "./package.json": "./package.json" + }, + "scripts": { + "install": "node install.js" + }, + "dependencies": { + "playwright-core": "1.38.0-next" + } +} diff --git a/packages/playwright-browser-webkit/README.md b/packages/playwright-browser-webkit/README.md new file mode 100644 index 0000000000..c8196534f4 --- /dev/null +++ b/packages/playwright-browser-webkit/README.md @@ -0,0 +1,3 @@ +# @playwright/browser-webkit + +This package automatically installs [WebKit](https://www.webkit.org/) browser for [Playwright](http://github.com/microsoft/playwright) library. If you want to write end-to-end tests, we recommend [@playwright/test](https://playwright.dev/docs/intro). diff --git a/packages/playwright-browser-webkit/index.d.ts b/packages/playwright-browser-webkit/index.d.ts new file mode 100644 index 0000000000..89d098eaca --- /dev/null +++ b/packages/playwright-browser-webkit/index.d.ts @@ -0,0 +1,17 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export {}; diff --git a/packages/playwright-browser-webkit/index.js b/packages/playwright-browser-webkit/index.js new file mode 100644 index 0000000000..c391f5c267 --- /dev/null +++ b/packages/playwright-browser-webkit/index.js @@ -0,0 +1,15 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/packages/playwright-browser-webkit/index.mjs b/packages/playwright-browser-webkit/index.mjs new file mode 100644 index 0000000000..c391f5c267 --- /dev/null +++ b/packages/playwright-browser-webkit/index.mjs @@ -0,0 +1,15 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/packages/playwright/install.js b/packages/playwright-browser-webkit/install.js similarity index 87% rename from packages/playwright/install.js rename to packages/playwright-browser-webkit/install.js index d325c22096..237ee38d63 100644 --- a/packages/playwright/install.js +++ b/packages/playwright-browser-webkit/install.js @@ -18,10 +18,10 @@ let install; try { if (!require('playwright-core/lib/utils').isLikelyNpxGlobal()) - install = require('playwright-core/lib/server').installDefaultBrowsersForNpmInstall; + install = require('playwright-core/lib/server').installBrowsersForNpmInstall; } catch (e) { // Dev build, don't install browsers by default. } if (install) - install(); + install(['webkit']); diff --git a/packages/playwright-browser-webkit/package.json b/packages/playwright-browser-webkit/package.json new file mode 100644 index 0000000000..4a8f58a4f6 --- /dev/null +++ b/packages/playwright-browser-webkit/package.json @@ -0,0 +1,29 @@ +{ + "name": "@playwright/browser-webkit", + "version": "1.38.0-next", + "description": "Playwright package that automatically installs WebKit", + "repository": "github:Microsoft/playwright", + "homepage": "https://playwright.dev", + "engines": { + "node": ">=16" + }, + "author": { + "name": "Microsoft Corporation" + }, + "license": "Apache-2.0", + "exports": { + ".": { + "types": "./index.d.ts", + "import": "./index.mjs", + "require": "./index.js", + "default": "./index.js" + }, + "./package.json": "./package.json" + }, + "scripts": { + "install": "node install.js" + }, + "dependencies": { + "playwright-core": "1.38.0-next" + } +} diff --git a/packages/playwright/package.json b/packages/playwright/package.json index 59a141f981..2b9123043f 100644 --- a/packages/playwright/package.json +++ b/packages/playwright/package.json @@ -25,7 +25,6 @@ "playwright": "./cli.js" }, "scripts": { - "install": "node install.js" }, "dependencies": { "playwright-core": "1.38.0-next" diff --git a/tests/installation/android-types.spec.ts b/tests/installation/android-types.spec.ts index e8e84004d1..f45268c487 100755 --- a/tests/installation/android-types.spec.ts +++ b/tests/installation/android-types.spec.ts @@ -16,7 +16,7 @@ import { test } from './npmTest'; test('android types', async ({ exec, tsc, writeFiles }) => { - await exec('npm i --foreground-scripts playwright', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); + await exec('npm i --foreground-scripts playwright'); await writeFiles({ 'test.ts': `import { AndroidDevice, _android, AndroidWebView, Page } from 'playwright';`, diff --git a/tests/installation/driver-should-work.spec.ts b/tests/installation/driver-should-work.spec.ts index 7c30bcee6b..99c57e27c7 100755 --- a/tests/installation/driver-should-work.spec.ts +++ b/tests/installation/driver-should-work.spec.ts @@ -16,7 +16,7 @@ import { test, expect } from './npmTest'; test('driver should work', async ({ exec }) => { - await exec('npm i --foreground-scripts playwright', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); + await exec('npm i --foreground-scripts playwright'); await exec('npx playwright install'); await exec('node driver-client.js'); }); @@ -24,7 +24,7 @@ test('driver should work', async ({ exec }) => { test('driver should ignore SIGINT', async ({ exec }) => { test.skip(process.platform === 'win32', 'Only relevant for POSIX'); test.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright-python/issues/1843' }); - await exec('npm i --foreground-scripts playwright', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); + await exec('npm i --foreground-scripts playwright'); await exec('npx playwright install chromium'); const output = await exec('node driver-client-sigint.js'); const lines = output.split('\n').filter(l => l.trim()); diff --git a/tests/installation/electron-types.spec.ts b/tests/installation/electron-types.spec.ts index a2257f9459..ccb1eae7d9 100755 --- a/tests/installation/electron-types.spec.ts +++ b/tests/installation/electron-types.spec.ts @@ -16,7 +16,7 @@ import { test } from './npmTest'; test('electron types', async ({ exec, tsc, writeFiles }) => { - await exec('npm i --foreground-scripts playwright electron@12', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); + await exec('npm i --foreground-scripts playwright electron@12'); await writeFiles({ 'test.ts': `import { Page, _electron, ElectronApplication, Electron } from 'playwright';` diff --git a/tests/installation/fixture-scripts/browser-only.js b/tests/installation/fixture-scripts/browser-only.js new file mode 100644 index 0000000000..3642923c36 --- /dev/null +++ b/tests/installation/fixture-scripts/browser-only.js @@ -0,0 +1,27 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const requireName = process.argv[2]; +const pkg = require(requireName); + +for (const key of ['chromium', 'firefox', 'webkit', 'test', 'devices']) { + if (pkg[key] !== undefined) { + console.error(`Package ${requireName} should not export ${key}`); + process.exit(1); + } +} + +console.log(`${requireName} SUCCESS`); diff --git a/tests/installation/fixture-scripts/sanity.js b/tests/installation/fixture-scripts/sanity.js index 92ea51a9b6..3b714f8d4c 100644 --- a/tests/installation/fixture-scripts/sanity.js +++ b/tests/installation/fixture-scripts/sanity.js @@ -15,20 +15,7 @@ */ const requireName = process.argv[2]; -let success = { - 'playwright': ['chromium', 'firefox', 'webkit'], - 'playwright-chromium': ['chromium'], - 'playwright-firefox': ['firefox'], - 'playwright-webkit': ['webkit'], - '@playwright/test': ['chromium', 'firefox', 'webkit'], -}[requireName]; -if (process.argv[3] === 'none') - success = []; -else if (process.argv[3] === 'all') - success = ['chromium', 'firefox', 'webkit']; -else if (process.argv[3]) - success = process.argv.slice(3) - +const success = process.argv.slice(3); const playwright = require(requireName); const packageJSON = require(requireName + '/package.json'); diff --git a/tests/installation/fixture-scripts/screencast.js b/tests/installation/fixture-scripts/screencast.js index 2c6dd77a6f..cc2083f68f 100644 --- a/tests/installation/fixture-scripts/screencast.js +++ b/tests/installation/fixture-scripts/screencast.js @@ -15,16 +15,7 @@ */ const requireName = process.argv[2]; -let success = { - 'playwright': ['chromium', 'firefox', 'webkit'], - 'playwright-chromium': ['chromium'], - 'playwright-firefox': ['firefox'], - 'playwright-webkit': ['webkit'], -}[requireName]; -if (process.argv[3] === 'none') - success = []; -if (process.argv[3] === 'all') - success = ['chromium', 'firefox', 'webkit']; +const success = process.argv.slice(3); const playwright = require(requireName); const fs = require('fs'); diff --git a/tests/installation/globalSetup.ts b/tests/installation/globalSetup.ts index 8224b29e70..f9cc7b1756 100644 --- a/tests/installation/globalSetup.ts +++ b/tests/installation/globalSetup.ts @@ -50,6 +50,9 @@ async function globalSetup() { build('playwright-chromium'), build('playwright-firefox'), build('playwright-webkit'), + build('playwright-browser-chromium', '@playwright/browser-chromium'), + build('playwright-browser-firefox', '@playwright/browser-firefox'), + build('playwright-browser-webkit', '@playwright/browser-webkit'), ]); await fs.promises.writeFile(path.join(__dirname, '.registry.json'), JSON.stringify(Object.fromEntries(builds))); diff --git a/tests/installation/npm-installs-local-packages.spec.ts b/tests/installation/npm-installs-local-packages.spec.ts index 1645d805bb..01e88baaa8 100755 --- a/tests/installation/npm-installs-local-packages.spec.ts +++ b/tests/installation/npm-installs-local-packages.spec.ts @@ -18,7 +18,7 @@ import { test, expect } from './npmTest'; import fs from 'fs'; test('installs local packages', async ({ registry, exec, tmpWorkspace }) => { - const packages = ['playwright', 'playwright-core', 'playwright-chromium', 'playwright-firefox', 'playwright-webkit', '@playwright/test']; + const packages = ['playwright', 'playwright-core', 'playwright-chromium', 'playwright-firefox', 'playwright-webkit', '@playwright/test', '@playwright/browser-chromium', '@playwright/browser-firefox', '@playwright/browser-webkit']; await exec('npm i --foreground-scripts', ...packages, { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); const output = await exec('node', path.join(__dirname, '..', '..', 'utils', 'workspace.js'), '--get-version'); diff --git a/tests/installation/npx-global-install.spec.ts b/tests/installation/npx-global-install.spec.ts index 0643903c09..81f84e60c5 100755 --- a/tests/installation/npx-global-install.spec.ts +++ b/tests/installation/npx-global-install.spec.ts @@ -17,6 +17,7 @@ import { test, expect } from './npmTest'; test('npx playwright install global', async ({ exec, installedSoftwareOnDisk }) => { test.skip(process.platform === 'win32', 'isLikelyNpxGlobal() does not work in this setup on our bots'); + const result = await exec('npx playwright install', { env: { npm_config_prefix: '' } }); // global npx and npm_config_prefix do not work together nicely (https://github.com/npm/cli/issues/5268) expect(result).toHaveLoggedSoftwareDownload(['chromium', 'ffmpeg', 'firefox', 'webkit']); expect(await installedSoftwareOnDisk()).toEqual(['chromium', 'ffmpeg', 'firefox', 'webkit']); diff --git a/tests/installation/playwright-cdn-failover-should-work.spec.ts b/tests/installation/playwright-cdn-failover-should-work.spec.ts index 74dd05166b..9df7433607 100644 --- a/tests/installation/playwright-cdn-failover-should-work.spec.ts +++ b/tests/installation/playwright-cdn-failover-should-work.spec.ts @@ -35,13 +35,14 @@ const parsedDownloads = (rawLogs: string) => { for (const cdn of CDNS) { test(`playwright cdn failover should work (${cdn})`, async ({ exec, nodeMajorVersion, installedSoftwareOnDisk }) => { - const result = await exec('npm i --foreground-scripts playwright', { env: { PW_TEST_CDN_THAT_SHOULD_WORK: cdn, DEBUG: 'pw:install' } }); + await exec('npm i --foreground-scripts playwright'); + const result = await exec('npx playwright install', { env: { PW_TEST_CDN_THAT_SHOULD_WORK: cdn, DEBUG: 'pw:install' } }); expect(result).toHaveLoggedSoftwareDownload(['chromium', 'ffmpeg', 'firefox', 'webkit']); expect(await installedSoftwareOnDisk()).toEqual(['chromium', 'ffmpeg', 'firefox', 'webkit']); const dls = parsedDownloads(result); for (const software of ['chromium', 'ffmpeg', 'firefox', 'webkit']) expect(dls).toContainEqual({ status: 200, name: software, url: expect.stringContaining(cdn) }); - await exec('node sanity.js playwright'); + await exec('node sanity.js playwright chromium firefox webkit'); if (nodeMajorVersion >= 14) await exec('node esm-playwright.mjs'); const stdio = await exec('npx playwright', 'test', '-c', '.', { expectToExitWithError: true }); diff --git a/tests/installation/playwright-cdn-should-race-with-timeout.spec.ts b/tests/installation/playwright-cdn-should-race-with-timeout.spec.ts index e24f18328b..95ce79cb55 100644 --- a/tests/installation/playwright-cdn-should-race-with-timeout.spec.ts +++ b/tests/installation/playwright-cdn-should-race-with-timeout.spec.ts @@ -21,7 +21,8 @@ test(`playwright cdn should race with a timeout`, async ({ exec }) => { const server = http.createServer(() => {}); await new Promise(resolve => server.listen(0, resolve)); try { - const result = await exec('npm i --foreground-scripts playwright', { + await exec('npm i --foreground-scripts playwright'); + const result = await exec('npx playwright install', { env: { PLAYWRIGHT_DOWNLOAD_HOST: `http://127.0.0.1:${(server.address() as AddressInfo).port}`, DEBUG: 'pw:install', diff --git a/tests/installation/playwright-cli-codegen.spec.ts b/tests/installation/playwright-cli-codegen.spec.ts index ecaa0470be..64657555b3 100755 --- a/tests/installation/playwright-cli-codegen.spec.ts +++ b/tests/installation/playwright-cli-codegen.spec.ts @@ -17,6 +17,7 @@ import { test, expect } from './npmTest'; test('codegen should work', async ({ exec }) => { await exec('npm i --foreground-scripts playwright'); + await exec('npx playwright install chromium'); await test.step('codegen without arguments', async () => { const result = await exec('npx playwright codegen', { diff --git a/tests/installation/playwright-cli-install-should-work-with-languages.spec.ts b/tests/installation/playwright-cli-install-should-work-with-languages.spec.ts index 9dd44b75ea..0ef07c8dbe 100755 --- a/tests/installation/playwright-cli-install-should-work-with-languages.spec.ts +++ b/tests/installation/playwright-cli-install-should-work-with-languages.spec.ts @@ -16,7 +16,7 @@ import { test, expect } from './npmTest'; test('codegen should print the right install command without browsers', async ({ exec }) => { - await exec('npm i --foreground-scripts playwright', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); + await exec('npm i --foreground-scripts playwright'); const pwLangName2InstallCommand = { 'java': 'mvn exec:java -e -D exec.mainClass=com.microsoft.playwright.CLI -D exec.args="install"', diff --git a/tests/installation/playwright-cli-install-should-work.spec.ts b/tests/installation/playwright-cli-install-should-work.spec.ts index d5f3013913..8001dbaec3 100755 --- a/tests/installation/playwright-cli-install-should-work.spec.ts +++ b/tests/installation/playwright-cli-install-should-work.spec.ts @@ -15,7 +15,7 @@ */ import { test, expect } from './npmTest'; -test('codegen should work', async ({ exec, installedSoftwareOnDisk }) => { +test('install command should work', async ({ exec, installedSoftwareOnDisk }) => { await exec('npm i --foreground-scripts playwright', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); await test.step('playwright install chromium', async () => { @@ -30,12 +30,12 @@ test('codegen should work', async ({ exec, installedSoftwareOnDisk }) => { expect(await installedSoftwareOnDisk()).toEqual(['chromium', 'ffmpeg', 'firefox', 'webkit']); }); - await exec('node sanity.js playwright none', { env: { PLAYWRIGHT_BROWSERS_PATH: undefined } }); - await exec('node sanity.js playwright'); + await exec('node sanity.js playwright', { env: { PLAYWRIGHT_BROWSERS_PATH: undefined } }); + await exec('node sanity.js playwright chromium firefox webkit'); }); test('should be able to remove browsers', async ({ exec, installedSoftwareOnDisk }) => { - await exec('npm i --foreground-scripts playwright', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); + await exec('npm i --foreground-scripts playwright'); await exec('npx playwright install chromium'); expect(await installedSoftwareOnDisk()).toEqual(['chromium', 'ffmpeg']); await exec('npx playwright uninstall'); diff --git a/tests/installation/playwright-cli-screenshot-should-work.spec.ts b/tests/installation/playwright-cli-screenshot-should-work.spec.ts index 5cbcb486f8..49d5beaf62 100755 --- a/tests/installation/playwright-cli-screenshot-should-work.spec.ts +++ b/tests/installation/playwright-cli-screenshot-should-work.spec.ts @@ -19,6 +19,7 @@ import path from 'path'; test('playwright cli screenshot should work', async ({ exec, tmpWorkspace }) => { await exec('npm i --foreground-scripts playwright'); + await exec('npx playwright install chromium'); await exec(path.join('node_modules', '.bin', 'playwright'), 'screenshot about:blank one.png'); await fs.promises.stat(path.join(tmpWorkspace, 'one.png')); diff --git a/tests/installation/playwright-electron-should-work.spec.ts b/tests/installation/playwright-electron-should-work.spec.ts index 085389ccb5..6b7fdfbdcf 100755 --- a/tests/installation/playwright-electron-should-work.spec.ts +++ b/tests/installation/playwright-electron-should-work.spec.ts @@ -16,6 +16,6 @@ import { test } from './npmTest'; test('electron should work', async ({ exec }) => { - await exec('npm i --foreground-scripts playwright electron@9.0', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); + await exec('npm i --foreground-scripts playwright electron@19.0.11'); await exec('node sanity-electron.js'); }); diff --git a/tests/installation/playwright-global-installation-cross-package.spec.ts b/tests/installation/playwright-global-installation-cross-package.spec.ts index 2a002b7969..0f494d849a 100755 --- a/tests/installation/playwright-global-installation-cross-package.spec.ts +++ b/tests/installation/playwright-global-installation-cross-package.spec.ts @@ -19,10 +19,10 @@ test('global installation cross package', async ({ exec, installedSoftwareOnDisk const packages = ['playwright-chromium', 'playwright-firefox', 'playwright-webkit']; for (const pkg of packages) await exec('npm i --foreground-scripts', pkg, { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); - const result = await exec('npm i --foreground-scripts playwright'); + const result = await exec('npx playwright install'); expect(result).toHaveLoggedSoftwareDownload(['chromium', 'ffmpeg', 'firefox', 'webkit']); expect(await installedSoftwareOnDisk()).toEqual(['chromium', 'ffmpeg', 'firefox', 'webkit']); for (const pkg of packages) - await test.step(pkg, () => exec('node sanity.js', pkg, 'all')); + await test.step(pkg, () => exec('node sanity.js', pkg, 'chromium firefox webkit')); }); diff --git a/tests/installation/playwright-global-installation.spec.ts b/tests/installation/playwright-global-installation.spec.ts index b51c92b6c0..438247d398 100755 --- a/tests/installation/playwright-global-installation.spec.ts +++ b/tests/installation/playwright-global-installation.spec.ts @@ -16,9 +16,14 @@ import { test, expect } from './npmTest'; test('global installation', async ({ exec, installedSoftwareOnDisk }) => { - const result = await exec('npm i --foreground-scripts playwright'); - expect(result).toHaveLoggedSoftwareDownload(['chromium', 'ffmpeg', 'firefox', 'webkit']); + const result1 = await exec('npm i --foreground-scripts playwright'); + expect(result1).toHaveLoggedSoftwareDownload([]); + expect(await installedSoftwareOnDisk()).toEqual([]); + + const result2 = await exec('npx playwright install'); + expect(result2).toHaveLoggedSoftwareDownload(['chromium', 'ffmpeg', 'firefox', 'webkit']); expect(await installedSoftwareOnDisk()).toEqual(['chromium', 'ffmpeg', 'firefox', 'webkit']); - await exec('node sanity.js playwright none', { env: { PLAYWRIGHT_BROWSERS_PATH: undefined } }); - await exec('node sanity.js playwright'); + + await exec('node sanity.js playwright', { env: { PLAYWRIGHT_BROWSERS_PATH: undefined } }); + await exec('node sanity.js playwright chromium firefox webkit'); }); diff --git a/tests/installation/playwright-global-subsequent-installs.spec.ts b/tests/installation/playwright-global-subsequent-installs.spec.ts index 4db5ac1704..06dcda1ef9 100755 --- a/tests/installation/playwright-global-subsequent-installs.spec.ts +++ b/tests/installation/playwright-global-subsequent-installs.spec.ts @@ -18,11 +18,11 @@ import path from 'path'; test('subsequent installs works', async ({ exec }) => { test.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/1651' }); - await exec('npm i --foreground-scripts playwright'); + await exec('npm i --foreground-scripts @playwright/browser-chromium'); // Note: the `npm install` would not actually crash, the error // is merely logged to the console. To reproduce the error, we should make // sure that script's install.js can be run subsequently without unhandled promise rejections. // Note: the flag `--unhandled-rejections=strict` will force node to terminate in case // of UnhandledPromiseRejection. - await exec('node --unhandled-rejections=strict', path.join('node_modules', 'playwright', 'install.js')); + await exec('node --unhandled-rejections=strict', path.join('node_modules', '@playwright', 'browser-chromium', 'install.js')); }); diff --git a/tests/installation/playwright-should-work-with-relative-browsers-path.spec.ts b/tests/installation/playwright-should-work-with-relative-browsers-path.spec.ts index 9d6388f21b..ef48d46527 100755 --- a/tests/installation/playwright-should-work-with-relative-browsers-path.spec.ts +++ b/tests/installation/playwright-should-work-with-relative-browsers-path.spec.ts @@ -21,5 +21,6 @@ test('playwright should work with relative home path', async ({ exec, tmpWorkspa await fs.promises.mkdir(path.join(tmpWorkspace, 'foo')); // Make sure that browsers path is resolved relative to the `npm install` call location. await exec('npm i --foreground-scripts playwright', { cwd: path.join(tmpWorkspace, 'foo'), env: { PLAYWRIGHT_BROWSERS_PATH: path.join('..', 'relative') } }); - await exec('node sanity.js playwright', { env: { PLAYWRIGHT_BROWSERS_PATH: path.join('.', 'relative') } }); + await exec('npx playwright install', { cwd: path.join(tmpWorkspace, 'foo'), env: { PLAYWRIGHT_BROWSERS_PATH: path.join('..', 'relative') } }); + await exec('node sanity.js playwright chromium firefox webkit', { env: { PLAYWRIGHT_BROWSERS_PATH: path.join('.', 'relative') } }); }); diff --git a/tests/installation/playwright-should-work-with-relative-home-path.spec.ts b/tests/installation/playwright-should-work-with-relative-home-path.spec.ts index 6e4daac128..b6295ede4c 100755 --- a/tests/installation/playwright-should-work-with-relative-home-path.spec.ts +++ b/tests/installation/playwright-should-work-with-relative-home-path.spec.ts @@ -20,7 +20,7 @@ test('playwright should work with relative home path', async ({ exec }) => { test.skip(os.platform().startsWith('win')); const env = { PLAYWRIGHT_BROWSERS_PATH: '0', HOME: '.' }; - await exec('npm i --foreground-scripts playwright', { env }); + await exec('npm i --foreground-scripts playwright @playwright/browser-chromium @playwright/browser-webkit', { env }); // Firefox does not work with relative HOME. await exec('node sanity.js playwright chromium webkit', { env }); }); diff --git a/tests/installation/playwright-should-work.spec.ts b/tests/installation/playwright-should-work.spec.ts index 72d5bcedd2..79d76b8284 100755 --- a/tests/installation/playwright-should-work.spec.ts +++ b/tests/installation/playwright-should-work.spec.ts @@ -16,10 +16,15 @@ import { test, expect } from './npmTest'; test(`playwright should work`, async ({ exec, nodeMajorVersion, installedSoftwareOnDisk }) => { - const result = await exec('npm i --foreground-scripts playwright'); - expect(result).toHaveLoggedSoftwareDownload(['chromium', 'ffmpeg', 'firefox', 'webkit']); + const result1 = await exec('npm i --foreground-scripts playwright'); + expect(result1).toHaveLoggedSoftwareDownload([]); + expect(await installedSoftwareOnDisk()).toEqual([]); + + const result2 = await exec('npm i --foreground-scripts @playwright/browser-chromium @playwright/browser-firefox @playwright/browser-webkit'); + expect(result2).toHaveLoggedSoftwareDownload(['chromium', 'ffmpeg', 'firefox', 'webkit']); expect(await installedSoftwareOnDisk()).toEqual(['chromium', 'ffmpeg', 'firefox', 'webkit']); - await exec('node sanity.js playwright'); + + await exec('node sanity.js playwright chromium firefox webkit'); if (nodeMajorVersion >= 14) await exec('node esm-playwright.mjs'); const stdio = await exec('npx playwright', 'test', '-c', '.', { expectToExitWithError: true }); diff --git a/tests/installation/playwright-test-should-work.spec.ts b/tests/installation/playwright-test-should-work.spec.ts index bacbc0a247..0fb5242641 100755 --- a/tests/installation/playwright-test-should-work.spec.ts +++ b/tests/installation/playwright-test-should-work.spec.ts @@ -23,7 +23,7 @@ test('@playwright/test should work', async ({ exec, nodeMajorVersion, tmpWorkspa await exec('npx playwright install'); await exec('npx playwright test -c . --browser=all --reporter=list,json sample.spec.js', { env: { PLAYWRIGHT_JSON_OUTPUT_NAME: 'report.json' } }); await exec('node read-json-report.js', path.join(tmpWorkspace, 'report.json')); - await exec('node sanity.js @playwright/test'); + await exec('node sanity.js @playwright/test chromium firefox webkit'); if (nodeMajorVersion >= 14) await exec('node', 'esm-playwright-test.mjs'); }); diff --git a/tests/installation/playwright-xyz-should-work.spec.ts b/tests/installation/playwright-xyz-should-work.spec.ts index a5a888e920..11df8613d1 100755 --- a/tests/installation/playwright-xyz-should-work.spec.ts +++ b/tests/installation/playwright-xyz-should-work.spec.ts @@ -16,8 +16,9 @@ */ import { test, expect } from './npmTest'; -for (const pkg of ['playwright-chromium', 'playwright-firefox', 'playwright-webkit']) { - test(`${pkg} should work`, async ({ exec, nodeMajorVersion, installedSoftwareOnDisk }) => { +for (const browser of ['chromium', 'firefox', 'webkit']) { + test(`playwright-${browser} should work`, async ({ exec, nodeMajorVersion, installedSoftwareOnDisk }) => { + const pkg = `playwright-${browser}`; const result = await exec('npm i --foreground-scripts', pkg); const browserName = pkg.split('-')[1]; const expectedSoftware = [browserName]; @@ -26,8 +27,29 @@ for (const pkg of ['playwright-chromium', 'playwright-firefox', 'playwright-webk expect(result).toHaveLoggedSoftwareDownload(expectedSoftware as any); expect(await installedSoftwareOnDisk()).toEqual(expectedSoftware); expect(result).not.toContain(`To avoid unexpected behavior, please install your dependencies first`); - await exec('node sanity.js', pkg); + await exec('node sanity.js', pkg, browser); if (nodeMajorVersion >= 14) await exec('node', `esm-${pkg}.mjs`); }); } + +for (const browser of ['chromium', 'firefox', 'webkit']) { + test(`@playwright/browser-${browser} should work`, async ({ exec, installedSoftwareOnDisk }) => { + const pkg = `@playwright/browser-${browser}`; + const expectedSoftware = [browser]; + if (browser === 'chromium') + expectedSoftware.push('ffmpeg'); + + const result1 = await exec('npm i --foreground-scripts', pkg); + expect(result1).toHaveLoggedSoftwareDownload(expectedSoftware as any); + expect(await installedSoftwareOnDisk()).toEqual(expectedSoftware); + expect(result1).not.toContain(`To avoid unexpected behavior, please install your dependencies first`); + + const result2 = await exec('npm i --foreground-scripts playwright'); + expect(result2).toHaveLoggedSoftwareDownload([]); + expect(await installedSoftwareOnDisk()).toEqual(expectedSoftware); + + await exec('node sanity.js playwright', browser); + await exec('node browser-only.js', pkg); + }); +} diff --git a/tests/installation/screencast.spec.ts b/tests/installation/screencast.spec.ts index 5913b5a125..96ccbde981 100755 --- a/tests/installation/screencast.spec.ts +++ b/tests/installation/screencast.spec.ts @@ -16,8 +16,8 @@ import { test } from './npmTest'; test('screencast works', async ({ exec }) => { - const packages = ['playwright', 'playwright-chromium', 'playwright-firefox', 'playwright-webkit']; - await exec('npm i --foreground-scripts', ...packages); - for (const pkg of packages) - await test.step(pkg, () => exec('node screencast.js', pkg)); + await exec('npm i --foreground-scripts', 'playwright', 'playwright-chromium', 'playwright-firefox', 'playwright-webkit'); + await test.step('playwright', () => exec('node screencast.js playwright chromium firefox webkit')); + for (const browser of ['chromium', 'firefox', 'webkit']) + await test.step(browser, () => exec(`node screencast.js playwright-${browser} ${browser}`)); }); diff --git a/tests/installation/skip-browser-download-inspect-with-custom-executable.spec.ts b/tests/installation/skip-browser-download-inspect-with-custom-executable.spec.ts index 9d08416698..1a394d6a0f 100755 --- a/tests/installation/skip-browser-download-inspect-with-custom-executable.spec.ts +++ b/tests/installation/skip-browser-download-inspect-with-custom-executable.spec.ts @@ -16,7 +16,7 @@ import { test, expect } from './npmTest'; test('should skip download', async ({ exec }) => { - const installOutput = await exec('npm i --foreground-scripts playwright', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); + const installOutput = await exec('npm i --foreground-scripts playwright @playwright/browser-chromium', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); expect(installOutput).toContain('Skipping browsers download because'); if (process.platform === 'linux') { const output = await exec('node inspector-custom-executable.js', { env: { PWDEBUG: '1' } }); diff --git a/tests/installation/skip-browser-download.spec.ts b/tests/installation/skip-browser-download.spec.ts index 715e5fd5d9..98a016411d 100755 --- a/tests/installation/skip-browser-download.spec.ts +++ b/tests/installation/skip-browser-download.spec.ts @@ -16,7 +16,7 @@ import { test, expect } from './npmTest'; test('PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD should skip browser installs', async ({ exec, installedSoftwareOnDisk }) => { - const result = await exec('npm i --foreground-scripts playwright', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); + const result = await exec('npm i --foreground-scripts @playwright/browser-firefox', { env: { PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' } }); expect(result).toHaveLoggedSoftwareDownload([]); expect(await installedSoftwareOnDisk()).toEqual([]); expect(result).toContain(`Skipping browsers download because`); diff --git a/tests/installation/validate-dependencies.spec.ts b/tests/installation/validate-dependencies.spec.ts index f8a56b7d48..f68eb84ee3 100644 --- a/tests/installation/validate-dependencies.spec.ts +++ b/tests/installation/validate-dependencies.spec.ts @@ -18,12 +18,14 @@ import { test, expect } from './npmTest'; test.describe('validate dependencies', () => { test('default (on)', async ({ exec }) => { await exec('npm i --foreground-scripts playwright'); + await exec('npx playwright install chromium'); const result = await exec('node validate-dependencies.js'); expect(result).toContain(`PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS`); }); test('disabled (off)', async ({ exec }) => { await exec('npm i --foreground-scripts playwright'); + await exec('npx playwright install chromium'); const result = await exec('node validate-dependencies-skip-executable-path.js'); expect(result).not.toContain(`PLAYWRIGHT_SKIP_VALIDATE_HOST_REQUIREMENTS`); }); diff --git a/utils/workspace.js b/utils/workspace.js index c5e94803c3..a452523085 100755 --- a/utils/workspace.js +++ b/utils/workspace.js @@ -178,6 +178,21 @@ const workspace = new Workspace(ROOT_PATH, [ path: path.join(ROOT_PATH, 'packages', 'playwright-chromium'), files: LICENCE_FILES, }), + new PWPackage({ + name: '@playwright/browser-webkit', + path: path.join(ROOT_PATH, 'packages', 'playwright-browser-webkit'), + files: LICENCE_FILES, + }), + new PWPackage({ + name: '@playwright/browser-firefox', + path: path.join(ROOT_PATH, 'packages', 'playwright-browser-firefox'), + files: LICENCE_FILES, + }), + new PWPackage({ + name: '@playwright/browser-chromium', + path: path.join(ROOT_PATH, 'packages', 'playwright-browser-chromium'), + files: LICENCE_FILES, + }), new PWPackage({ name: '@playwright/experimental-ct-core', path: path.join(ROOT_PATH, 'packages', 'playwright-ct-core'),