diff --git a/src/actions.test.ts b/src/actions.test.ts new file mode 100644 index 0000000..91d7afa --- /dev/null +++ b/src/actions.test.ts @@ -0,0 +1,39 @@ +import { describe, it, expect } from 'vitest'; +import { toAIFriendlyError } from './actions.js'; + +describe('toAIFriendlyError', () => { + describe('element blocked by overlay', () => { + it('should detect intercepts pointer events even when Timeout is in message', () => { + // This is the exact error from Playwright when a cookie banner blocks an element + // Bug: Previously this was incorrectly reported as "not found or not visible" + const error = new Error( + 'TimeoutError: locator.click: Timeout 10000ms exceeded.\n' + + 'Call log:\n' + + " - waiting for getByRole('link', { name: 'Anmelden', exact: true }).first()\n" + + ' - locator resolved to Anmelden\n' + + ' - attempting click action\n' + + ' 2 x waiting for element to be visible, enabled and stable\n' + + ' - element is visible, enabled and stable\n' + + ' - scrolling into view if needed\n' + + ' - done scrolling\n' + + ' - ... intercepts pointer events\n' + + ' - retrying click action' + ); + + const result = toAIFriendlyError(error, '@e4'); + + // Must NOT say "not found" - the element WAS found + expect(result.message).not.toContain('not found'); + // Must indicate the element is blocked + expect(result.message).toContain('blocked by another element'); + expect(result.message).toContain('modal or overlay'); + }); + + it('should suggest dismissing cookie banners', () => { + const error = new Error('