Files
AI/참고/playwright-main/tests/mcp/cli-cdp.spec.ts
2026-05-12 19:40:31 +09:00

112 lines
4.1 KiB
TypeScript

/**
* 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 fs from 'fs';
import { test, expect, daemonFolder } from './cli-fixtures';
test.describe.configure({
retries: 1,
});
test('connect by channel name error', async ({ cli }) => {
const { error } = await cli('attach', '--cdp=chrome-dev');
expect(error).toContain('Could not connect to chrome-dev');
expect(error).toContain('chrome://inspect/#remote-debugging');
});
test('attach --cdp=<channel> defaults session name to the channel', async ({ cli }) => {
// Connection fails, but the daemon writes its err log under the resolved session name.
await cli('attach', '--cdp=chrome-dev');
const folder = await daemonFolder();
expect(folder).toBeTruthy();
const files = await fs.promises.readdir(folder!);
expect(files).toContain('chrome-dev.err');
expect(files).not.toContain('default.err');
});
test('explicit --session wins over --cdp=<channel>', async ({ cli }) => {
await cli('attach', '--cdp=chrome-dev', '-s=explicit');
const folder = await daemonFolder();
expect(folder).toBeTruthy();
const files = await fs.promises.readdir(folder!);
expect(files).toContain('explicit.err');
expect(files).not.toContain('chrome-dev.err');
});
test('attach via cdp URL keeps the default session', async ({ cdpServer, cli, server }) => {
const browserContext = await cdpServer.start();
const [page] = browserContext.pages();
await page.goto(server.HELLO_WORLD);
await cli('attach', `--cdp=${cdpServer.endpoint}`);
const { output: listOutput } = await cli('list');
expect(listOutput).toContain('- default:');
expect(listOutput).toContain('(attached)');
});
test('detach tears down an attached session', async ({ cdpServer, cli }) => {
await cdpServer.start();
await cli('attach', `--cdp=${cdpServer.endpoint}`, '-s=mine');
const { output: listBefore } = await cli('list');
expect(listBefore).toContain('- mine:');
expect(listBefore).toContain('(attached)');
const { output: detachOutput } = await cli('-s=mine', 'detach');
expect(detachOutput).toContain(`Browser 'mine' detached`);
const { output: listAfter } = await cli('list');
expect(listAfter).not.toContain('- mine:');
});
test('detach rejects sessions opened via open', async ({ cli, server }) => {
await cli('open', server.HELLO_WORLD);
const { error, exitCode } = await cli('detach');
expect(exitCode).toBe(1);
expect(error).toContain(`session 'default' was not attached`);
expect(error).toContain('close');
});
test('detach on unknown session reports not attached', async ({ cli }) => {
const { output } = await cli('-s=nobody', 'detach');
expect(output).toContain(`Browser 'nobody' is not attached.`);
});
test('cdp server', async ({ cdpServer, cli, server }) => {
const browserContext = await cdpServer.start();
const [page] = browserContext.pages();
await page.goto(server.HELLO_WORLD);
const configPath = test.info().outputPath('config.ini');
await fs.promises.writeFile(configPath, `
browser.isolated=false
`);
await cli('attach', `--cdp=${cdpServer.endpoint}`, `--config=${configPath}`);
const { inlineSnapshot } = await cli('snapshot');
expect(inlineSnapshot).toContain(`- generic [active] [ref=e1]: Hello, world!`);
});
test('attach via cdp', async ({ cdpServer, cli, server }) => {
const browserContext = await cdpServer.start();
const [page] = browserContext.pages();
await page.goto(server.HELLO_WORLD);
await cli('attach', `--cdp=${cdpServer.endpoint}`);
const { inlineSnapshot } = await cli('snapshot');
expect(inlineSnapshot).toContain(`- generic [active] [ref=e1]: Hello, world!`);
});