feat: browser_choose_file (#52)
Resolves https://github.com/microsoft/playwright-mcp/issues/31. Prompt used for testing: ``` upload test.txt to dropbox ``` This won't work for asynchronously opened filechoosers, but let's start with the synchronous variant. I also tested with including the file chooser open state in the snapshot, but that didn't give better results. I also tested with OneDrive and WeTransfer, but somehow our ARIA snapshots for those pages are missing some elements that are crucial to locate the upload buttons.
This commit is contained in:
@@ -73,23 +73,36 @@ async function waitForCompletion<R>(page: playwright.Page, callback: () => Promi
|
||||
|
||||
export async function runAndWait(context: Context, status: string, callback: (page: playwright.Page) => Promise<any>, snapshot: boolean = false): Promise<ToolResult> {
|
||||
const page = context.existingPage();
|
||||
const dismissFileChooser = context.hasFileChooser();
|
||||
await waitForCompletion(page, () => callback(page));
|
||||
return snapshot ? captureAriaSnapshot(context, status) : {
|
||||
if (dismissFileChooser)
|
||||
context.clearFileChooser();
|
||||
const result: ToolResult = snapshot ? await captureAriaSnapshot(context, status) : {
|
||||
content: [{ type: 'text', text: status }],
|
||||
};
|
||||
return result;
|
||||
}
|
||||
|
||||
export async function captureAriaSnapshot(context: Context, status: string = ''): Promise<ToolResult> {
|
||||
const page = context.existingPage();
|
||||
const lines = [];
|
||||
if (status)
|
||||
lines.push(`${status}`);
|
||||
lines.push(
|
||||
'',
|
||||
`- Page URL: ${page.url()}`,
|
||||
`- Page Title: ${await page.title()}`
|
||||
);
|
||||
if (context.hasFileChooser())
|
||||
lines.push(`- There is a file chooser visible that requires browser_choose_file to be called`);
|
||||
lines.push(
|
||||
`- Page Snapshot`,
|
||||
'```yaml',
|
||||
await context.allFramesSnapshot(),
|
||||
'```',
|
||||
''
|
||||
);
|
||||
return {
|
||||
content: [{ type: 'text', text: `${status ? `${status}\n` : ''}
|
||||
- Page URL: ${page.url()}
|
||||
- Page Title: ${await page.title()}
|
||||
- Page Snapshot
|
||||
\`\`\`yaml
|
||||
${await context.allFramesSnapshot()}
|
||||
\`\`\`
|
||||
`
|
||||
}],
|
||||
content: [{ type: 'text', text: lines.join('\n') }],
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user