fix: stitch all frames into one snapshot (#49)

This commit is contained in:
Simon Knott
2025-03-27 17:20:58 +01:00
committed by GitHub
parent fb24561c67
commit 723a5420e6
3 changed files with 54 additions and 3 deletions

View File

@@ -155,5 +155,13 @@ export const screenshot: Tool = {
};
function refLocator(page: playwright.Page, ref: string): playwright.Locator {
return page.locator(`aria-ref=${ref}`);
let frame = page.frames()[0];
const match = ref.match(/^f(\d+)(.*)/);
if (match) {
const frameIndex = parseInt(match[1], 10);
frame = page.frames()[frameIndex];
ref = match[2];
}
return frame.locator(`aria-ref=${ref}`);
}

View File

@@ -79,15 +79,24 @@ export async function runAndWait(context: Context, status: string, callback: (pa
};
}
export async function captureAllFrameSnapshot(page: playwright.Page): Promise<string> {
const snapshots = await Promise.all(page.frames().map(frame => frame.locator('html').ariaSnapshot({ ref: true })));
const scopedSnapshots = snapshots.map((snapshot, frameIndex) => {
if (frameIndex === 0)
return snapshot;
return snapshot.replaceAll('[ref=', `[ref=f${frameIndex}`);
});
return scopedSnapshots.join('\n');
}
export async function captureAriaSnapshot(page: playwright.Page, status: string = ''): Promise<ToolResult> {
const snapshot = await page.locator('html').ariaSnapshot({ ref: true });
return {
content: [{ type: 'text', text: `${status ? `${status}\n` : ''}
- Page URL: ${page.url()}
- Page Title: ${await page.title()}
- Page Snapshot
\`\`\`yaml
${snapshot}
${await captureAllFrameSnapshot(page)}
\`\`\`
`
}],