diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6dad2de..be7f5a9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,7 @@ jobs: - name: Ensure no changes run: git diff --exit-code - test_mcp: + test: strategy: fail-fast: false matrix: @@ -38,9 +38,24 @@ jobs: run: npm ci - name: Playwright install run: npx playwright install --with-deps - - name: Run tests - run: npm run test - working-directory: ./packages/playwright-mcp + - name: Build + run: npm run build + - name: Run playwright-mcp tests + id: test-mcp + run: npm run test --workspace=packages/playwright-mcp + continue-on-error: true + - name: Run playwright-cli tests + id: test-cli + run: npm run test --workspace=packages/playwright-cli + continue-on-error: true + - name: Run extension tests + id: test-extension + if: matrix.os == 'macos-15' + run: npm run test --workspace=packages/extension + continue-on-error: true + - name: Check test results + if: steps.test-mcp.outcome == 'failure' || steps.test-cli.outcome == 'failure' || steps.test-extension.outcome == 'failure' + run: exit 1 test_mcp_docker: runs-on: ubuntu-latest @@ -73,35 +88,3 @@ jobs: working-directory: ./packages/playwright-mcp env: MCP_IN_DOCKER: 1 - - test_extension: - runs-on: macos-latest - steps: - - uses: actions/checkout@v4 - - name: Use Node.js 20 - uses: actions/setup-node@v4 - with: - node-version: '20' # crypto.randomUUID(); stalls in v18.20.8 - cache: 'npm' - - name: Install dependencies - run: npm ci - - name: Playwright install - run: npx playwright install --with-deps - - name: Build extension - run: npm run build - working-directory: ./packages/extension - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: extension - path: ./extension/dist - retention-days: 7 - - name: Run tests - run: | - if [[ "$(uname)" == "Linux" ]]; then - xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test - else - npm run test - fi - shell: bash - working-directory: ./packages/extension diff --git a/package-lock.json b/package-lock.json index e08672a..2a794c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "playwright-mcp-internal", - "version": "0.0.62", + "version": "0.0.63", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "playwright-mcp-internal", - "version": "0.0.62", + "version": "0.0.63", "license": "Apache-2.0", "workspaces": [ "packages/*" ], "devDependencies": { "@modelcontextprotocol/sdk": "^1.25.2", - "@playwright/test": "1.59.0-alpha-1769819922000", + "@playwright/test": "1.59.0-alpha-1770157258000", "@types/node": "^24.3.0" } }, @@ -806,13 +806,13 @@ "link": true }, "node_modules/@playwright/test": { - "version": "1.59.0-alpha-1769819922000", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.0-alpha-1769819922000.tgz", - "integrity": "sha512-Oc24xlFGpqs+fUqnLXLbfVTIaN/+ws2Nb9R7B1laIXn1ZpI42UT5b3Bu1Lh3DiyKQStO2Il+ljwL9+ZF5rLFLQ==", + "version": "1.59.0-alpha-1770157258000", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.0-alpha-1770157258000.tgz", + "integrity": "sha512-zBg9P0xkKXnDrSr7zmVqkGnUwiR/2PnxHs2zWsQ9EeG76X5YOn5hcuog/1YFrzOKvYOb+bcnjXb+dMTn8fkMTA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.59.0-alpha-1769819922000" + "playwright": "1.59.0-alpha-1770157258000" }, "bin": { "playwright": "cli.js" @@ -2562,12 +2562,12 @@ } }, "node_modules/playwright": { - "version": "1.59.0-alpha-1769819922000", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.0-alpha-1769819922000.tgz", - "integrity": "sha512-SVy14jHP15zyxPHfQSnpA628sRG/dX5SSR9VymG6aI9tRUlBhInQgmeW0YcX65aaMrmhIdo50BUYtDn+kcjYEQ==", + "version": "1.59.0-alpha-1770157258000", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.0-alpha-1770157258000.tgz", + "integrity": "sha512-jGMgi+61xaC9Pf7cIalsgKy4g0oAreA8U4/Lr8E0xhYl3pWd/U3F6s/m7GBWxJHHEiQcIdnP3mUdy1FTOyl8SQ==", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.59.0-alpha-1769819922000" + "playwright-core": "1.59.0-alpha-1770157258000" }, "bin": { "playwright": "cli.js" @@ -2584,9 +2584,9 @@ "link": true }, "node_modules/playwright-core": { - "version": "1.59.0-alpha-1769819922000", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.0-alpha-1769819922000.tgz", - "integrity": "sha512-mHxFU9XPUiC1HWkZWuTG1tbZxjSWkjHhsHFyrxRs3KDTBsSrsRwaa/lw6awSzubLqDI7OsuqXptnO/AB7ozhoQ==", + "version": "1.59.0-alpha-1770157258000", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.0-alpha-1770157258000.tgz", + "integrity": "sha512-D+3ARZYNY7/i6LyV6DKsPQHkzfmuMXMdKdyW981i5CHA4GmXY2NTt1F7cEL4fGYJFpwPqTfQ17Qhas8dnirPkg==", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -3306,7 +3306,7 @@ }, "packages/extension": { "name": "@playwright/mcp-extension", - "version": "0.0.62", + "version": "0.0.63", "license": "Apache-2.0", "devDependencies": { "@types/chrome": "^0.0.315", @@ -3325,12 +3325,12 @@ }, "packages/playwright-cli": { "name": "@playwright/cli", - "version": "0.0.62", + "version": "0.0.63", "license": "Apache-2.0", "dependencies": { "minimist": "^1.2.5", - "playwright": "1.59.0-alpha-1769819922000", - "playwright-core": "1.59.0-alpha-1769819922000" + "playwright": "1.59.0-alpha-1770157258000", + "playwright-core": "1.59.0-alpha-1770157258000" }, "bin": { "playwright-cli": "playwright-cli.js" @@ -3341,67 +3341,20 @@ }, "packages/playwright-cli-stub": { "name": "playwright-cli", - "version": "0.0.62", + "version": "0.0.63", "license": "Apache-2.0", "dependencies": { - "@playwright/cli": "0.0.61" + "@playwright/cli": "0.0.63" }, "devDependencies": {} }, - "packages/playwright-cli-stub/node_modules/@playwright/cli": { - "version": "0.0.61", - "resolved": "https://registry.npmjs.org/@playwright/cli/-/cli-0.0.61.tgz", - "integrity": "sha512-TFovFfiKCQHuNhZCVHySPHkcvWXQFuKDSXYPexFzwoJ/aHJjpfBIs6Srlv3aowtZ3MQ1A0/Krq7aUMNnFvhUkA==", - "license": "Apache-2.0", - "dependencies": { - "minimist": "^1.2.5", - "playwright": "1.59.0-alpha-1769452054000", - "playwright-core": "1.59.0-alpha-1769452054000" - }, - "bin": { - "playwright-cli": "playwright-cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "packages/playwright-cli-stub/node_modules/playwright": { - "version": "1.59.0-alpha-1769452054000", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.0-alpha-1769452054000.tgz", - "integrity": "sha512-emHM/Pt6ACb0zZOOZNNQg6ahAbpiRKgWxmXeqhcmXWYbZ8zk+GIXavyBHYe5O3KC7GEHizECu83x1EldD3vs7Q==", - "license": "Apache-2.0", - "dependencies": { - "playwright-core": "1.59.0-alpha-1769452054000" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, - "packages/playwright-cli-stub/node_modules/playwright-core": { - "version": "1.59.0-alpha-1769452054000", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.0-alpha-1769452054000.tgz", - "integrity": "sha512-JulA7CBOf/Ks/MrXVpylMn9NLKRI933ZOR7A6lqW+VsAgSxrAE+j5BsxArSBaO1dUI1EfrVl0hDzVs4ftnWhaw==", - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, "packages/playwright-mcp": { "name": "@playwright/mcp", - "version": "0.0.62", + "version": "0.0.63", "license": "Apache-2.0", "dependencies": { - "playwright": "1.59.0-alpha-1769819922000", - "playwright-core": "1.59.0-alpha-1769819922000" + "playwright": "1.59.0-alpha-1770157258000", + "playwright-core": "1.59.0-alpha-1770157258000" }, "bin": { "playwright-mcp": "cli.js" diff --git a/package.json b/package.json index 61e2956..4338cc6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "playwright-mcp-internal", - "version": "0.0.62", + "version": "0.0.63", "private": true, "repository": { "type": "git", @@ -25,7 +25,7 @@ ], "devDependencies": { "@modelcontextprotocol/sdk": "^1.25.2", - "@playwright/test": "1.59.0-alpha-1769819922000", + "@playwright/test": "1.59.0-alpha-1770157258000", "@types/node": "^24.3.0" } } diff --git a/packages/extension/manifest.json b/packages/extension/manifest.json index 891e36a..236f354 100644 --- a/packages/extension/manifest.json +++ b/packages/extension/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Playwright MCP Bridge", - "version": "0.0.61", + "version": "0.0.63", "description": "Share browser tabs with Playwright MCP server", "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9nMS2b0WCohjVHPGb8D9qAdkbIngDqoAjTeSccHJijgcONejge+OJxOQOMLu7b0ovt1c9BiEJa5JcpM+EHFVGL1vluBxK71zmBy1m2f9vZF3HG0LSCp7YRkum9rAIEthDwbkxx6XTvpmAY5rjFa/NON6b9Hlbo+8peUSkoOK7HTwYnnI36asZ9eUTiveIf+DMPLojW2UX33vDWG2UKvMVDewzclb4+uLxAYshY7Mx8we/b44xu+Anb/EBLKjOPk9Yh541xJ5Ozc8EiP/5yxOp9c/lRiYUHaRW+4r0HKZyFt0eZ52ti2iM4Nfk7jRXR7an3JPsUIf5deC/1cVM/+1ZQIDAQAB", "permissions": [ diff --git a/packages/extension/package.json b/packages/extension/package.json index 0019e7d..80242a7 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/mcp-extension", - "version": "0.0.62", + "version": "0.0.63", "description": "Playwright MCP Browser Extension", "private": true, "repository": { diff --git a/packages/playwright-cli-stub/package.json b/packages/playwright-cli-stub/package.json index 96c7007..ef837c2 100644 --- a/packages/playwright-cli-stub/package.json +++ b/packages/playwright-cli-stub/package.json @@ -1,6 +1,6 @@ { "name": "playwright-cli", - "version": "0.0.62", + "version": "0.0.63", "description": "Playwright CLI", "repository": "github:Microsoft/playwright-cli", "homepage": "https://playwright.dev", @@ -14,7 +14,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@playwright/cli": "0.0.61" + "@playwright/cli": "0.0.63" }, "devDependencies": {} } diff --git a/packages/playwright-cli/package.json b/packages/playwright-cli/package.json index d182add..8500c0a 100644 --- a/packages/playwright-cli/package.json +++ b/packages/playwright-cli/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/cli", - "version": "0.0.62", + "version": "0.0.63", "description": "Playwright CLI", "repository": { "type": "git", @@ -17,12 +17,12 @@ "scripts": { "lint": "echo OK", "build": "echo OK", - "test": "echo OK" + "test": "playwright test" }, "dependencies": { "minimist": "^1.2.5", - "playwright": "1.59.0-alpha-1769819922000", - "playwright-core": "1.59.0-alpha-1769819922000" + "playwright": "1.59.0-alpha-1770157258000", + "playwright-core": "1.59.0-alpha-1770157258000" }, "bin": { "playwright-cli": "playwright-cli.js" diff --git a/packages/playwright-cli/playwright-cli.js b/packages/playwright-cli/playwright-cli.js index 1143597..79ef979 100755 --- a/packages/playwright-cli/playwright-cli.js +++ b/packages/playwright-cli/playwright-cli.js @@ -16,8 +16,8 @@ */ const { program } = require('playwright/lib/mcp/terminal/program'); -const packageJSON = require('./package.json'); -program({ version: packageJSON.version }).catch(e => { +const packageLocation = require.resolve('./package.json'); +program(packageLocation).catch(e => { console.error(e.message); process.exit(1); }); diff --git a/packages/playwright-cli/playwright.config.ts b/packages/playwright-cli/playwright.config.ts new file mode 100644 index 0000000..6c928a1 --- /dev/null +++ b/packages/playwright-cli/playwright.config.ts @@ -0,0 +1,25 @@ +/** + * 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. + */ + +import { defineConfig } from '@playwright/test'; + +export default defineConfig({ + testDir: './tests', + fullyParallel: true, + forbidOnly: !!process.env.CI, + workers: process.env.CI ? 2 : undefined, + reporter: 'list', +}); diff --git a/packages/playwright-cli/tests/integration.spec.ts b/packages/playwright-cli/tests/integration.spec.ts new file mode 100644 index 0000000..af41ffb --- /dev/null +++ b/packages/playwright-cli/tests/integration.spec.ts @@ -0,0 +1,72 @@ +/** + * 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. + */ + +import path from 'path'; +import { spawn } from 'child_process'; +import { test, expect } from '@playwright/test'; + +type CliResult = { + output: string; + error: string; + exitCode: number | null; +}; + +async function runCli(...args: string[]): Promise { + const cliPath = path.join(__dirname, '../playwright-cli.js'); + + return new Promise((resolve, reject) => { + let stdout = ''; + let stderr = ''; + + const childProcess = spawn(process.execPath, [cliPath, ...args], { + env: { + ...process.env, + PLAYWRIGHT_CLI_INSTALLATION_FOR_TEST: test.info().outputPath(), + }, + cwd: test.info().outputPath(), + }); + + childProcess.stdout?.on('data', (data) => { + stdout += data.toString(); + }); + + childProcess.stderr?.on('data', (data) => { + stderr += data.toString(); + }); + + childProcess.on('close', (code) => { + resolve({ + output: stdout.trim(), + error: stderr.trim(), + exitCode: code, + }); + }); + + childProcess.on('error', reject); + }); +} + +test('open data URL', async ({}) => { + expect(await runCli('open', 'data:text/html,hello')).toEqual(expect.objectContaining({ + output: expect.stringContaining('hello'), + exitCode: 0, + })); + + expect(await runCli('session-delete')).toEqual(expect.objectContaining({ + output: expect.stringContaining('Deleted user data for session'), + exitCode: 0, + })); +}); diff --git a/packages/playwright-mcp/package.json b/packages/playwright-mcp/package.json index c301909..0b438f3 100644 --- a/packages/playwright-mcp/package.json +++ b/packages/playwright-mcp/package.json @@ -1,6 +1,6 @@ { "name": "@playwright/mcp", - "version": "0.0.62", + "version": "0.0.63", "description": "Playwright Tools for MCP", "repository": { "type": "git", @@ -34,8 +34,8 @@ } }, "dependencies": { - "playwright": "1.59.0-alpha-1769819922000", - "playwright-core": "1.59.0-alpha-1769819922000" + "playwright": "1.59.0-alpha-1770157258000", + "playwright-core": "1.59.0-alpha-1770157258000" }, "bin": { "playwright-mcp": "cli.js"