mirror of
https://github.com/microsoft/playwright-mcp.git
synced 2025-07-24 06:42:26 +08:00
158 lines
4.6 KiB
TypeScript
158 lines
4.6 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, formatOutput } from './fixtures.js';
|
|
|
|
test('test reopen browser', async ({ startClient, server, mcpMode }) => {
|
|
const { client, stderr } = await startClient();
|
|
await client.callTool({
|
|
name: 'browser_navigate',
|
|
arguments: { url: server.HELLO_WORLD },
|
|
});
|
|
|
|
expect(await client.callTool({
|
|
name: 'browser_close',
|
|
})).toContainTextContent('No open pages available');
|
|
|
|
expect(await client.callTool({
|
|
name: 'browser_navigate',
|
|
arguments: { url: server.HELLO_WORLD },
|
|
})).toContainTextContent(`- generic [active] [ref=e1]: Hello, world!`);
|
|
|
|
await client.close();
|
|
|
|
if (process.platform === 'win32')
|
|
return;
|
|
|
|
await expect.poll(() => formatOutput(stderr()), { timeout: 0 }).toEqual([
|
|
'create context',
|
|
'create browser context (persistent)',
|
|
'lock user data dir',
|
|
'close context',
|
|
'close browser context (persistent)',
|
|
'release user data dir',
|
|
'close browser context complete (persistent)',
|
|
'create browser context (persistent)',
|
|
'lock user data dir',
|
|
'close context',
|
|
'close browser context (persistent)',
|
|
'release user data dir',
|
|
'close browser context complete (persistent)',
|
|
]);
|
|
});
|
|
|
|
test('executable path', async ({ startClient, server }) => {
|
|
const { client } = await startClient({ args: [`--executable-path=bogus`] });
|
|
const response = await client.callTool({
|
|
name: 'browser_navigate',
|
|
arguments: { url: server.HELLO_WORLD },
|
|
});
|
|
expect(response).toContainTextContent(`executable doesn't exist`);
|
|
});
|
|
|
|
test('persistent context', async ({ startClient, server }) => {
|
|
server.setContent('/', `
|
|
<body>
|
|
</body>
|
|
<script>
|
|
document.body.textContent = localStorage.getItem('test') ? 'Storage: YES' : 'Storage: NO';
|
|
localStorage.setItem('test', 'test');
|
|
</script>
|
|
`, 'text/html');
|
|
|
|
const { client } = await startClient();
|
|
const response = await client.callTool({
|
|
name: 'browser_navigate',
|
|
arguments: { url: server.PREFIX },
|
|
});
|
|
expect(response).toContainTextContent(`Storage: NO`);
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
|
|
await client.callTool({
|
|
name: 'browser_close',
|
|
});
|
|
|
|
const { client: client2 } = await startClient();
|
|
const response2 = await client2.callTool({
|
|
name: 'browser_navigate',
|
|
arguments: { url: server.PREFIX },
|
|
});
|
|
|
|
expect(response2).toContainTextContent(`Storage: YES`);
|
|
});
|
|
|
|
test('isolated context', async ({ startClient, server }) => {
|
|
server.setContent('/', `
|
|
<body>
|
|
</body>
|
|
<script>
|
|
document.body.textContent = localStorage.getItem('test') ? 'Storage: YES' : 'Storage: NO';
|
|
localStorage.setItem('test', 'test');
|
|
</script>
|
|
`, 'text/html');
|
|
|
|
const { client: client1 } = await startClient({ args: [`--isolated`] });
|
|
const response = await client1.callTool({
|
|
name: 'browser_navigate',
|
|
arguments: { url: server.PREFIX },
|
|
});
|
|
expect(response).toContainTextContent(`Storage: NO`);
|
|
|
|
await client1.callTool({
|
|
name: 'browser_close',
|
|
});
|
|
|
|
const { client: client2 } = await startClient({ args: [`--isolated`] });
|
|
const response2 = await client2.callTool({
|
|
name: 'browser_navigate',
|
|
arguments: { url: server.PREFIX },
|
|
});
|
|
expect(response2).toContainTextContent(`Storage: NO`);
|
|
});
|
|
|
|
test('isolated context with storage state', async ({ startClient, server }, testInfo) => {
|
|
const storageStatePath = testInfo.outputPath('storage-state.json');
|
|
await fs.promises.writeFile(storageStatePath, JSON.stringify({
|
|
origins: [
|
|
{
|
|
origin: server.PREFIX,
|
|
localStorage: [{ name: 'test', value: 'session-value' }],
|
|
},
|
|
],
|
|
}));
|
|
|
|
server.setContent('/', `
|
|
<body>
|
|
</body>
|
|
<script>
|
|
document.body.textContent = 'Storage: ' + localStorage.getItem('test');
|
|
</script>
|
|
`, 'text/html');
|
|
|
|
const { client } = await startClient({ args: [
|
|
`--isolated`,
|
|
`--storage-state=${storageStatePath}`,
|
|
] });
|
|
const response = await client.callTool({
|
|
name: 'browser_navigate',
|
|
arguments: { url: server.PREFIX },
|
|
});
|
|
expect(response).toContainTextContent(`Storage: session-value`);
|
|
});
|