diff --git a/packages/playwright-core/src/server/recorder/recorderCollection.ts b/packages/playwright-core/src/server/recorder/recorderCollection.ts index 162d5d6813..9f28efd930 100644 --- a/packages/playwright-core/src/server/recorder/recorderCollection.ts +++ b/packages/playwright-core/src/server/recorder/recorderCollection.ts @@ -85,7 +85,7 @@ export class RecorderCollection extends EventEmitter { let generateGoto = false; if (!lastAction) generateGoto = true; - else if (lastAction.action.name !== 'click' && lastAction.action.name !== 'press') + else if (lastAction.action.name !== 'click' && lastAction.action.name !== 'press' && lastAction.action.name !== 'fill') generateGoto = true; else if (timestamp - lastAction.startTime > signalThreshold) generateGoto = true; diff --git a/tests/library/inspector/cli-codegen-1.spec.ts b/tests/library/inspector/cli-codegen-1.spec.ts index 6936aeee41..aa52daffa9 100644 --- a/tests/library/inspector/cli-codegen-1.spec.ts +++ b/tests/library/inspector/cli-codegen-1.spec.ts @@ -778,6 +778,70 @@ await page.GetByText("link").ClickAsync();`); expect(page.url()).toContain('about:blank#foo'); }); + test('should attribute navigation to press/fill', async ({ openRecorder }) => { + const { page, recorder } = await openRecorder(); + + await recorder.setContentAndWait(``); + + const locator = await recorder.hoverOverElement('input'); + expect(locator).toBe(`getByRole('textbox')`); + await recorder.trustedClick(); + await expect.poll(() => page.locator('input').evaluate(e => e === document.activeElement)).toBeTruthy(); + const [, sources] = await Promise.all([ + page.waitForNavigation(), + recorder.waitForOutput('JavaScript', '.fill'), + recorder.trustedPress('h'), + ]); + + expect.soft(sources.get('JavaScript')!.text).toContain(` + await page.goto('about:blank'); + await page.getByRole('textbox').click(); + await page.getByRole('textbox').fill('h'); + + // --------------------- + await context.close();`); + + expect.soft(sources.get('Playwright Test')!.text).toContain(` + await page.goto('about:blank'); + await page.getByRole('textbox').click(); + await page.getByRole('textbox').fill('h'); +});`); + + expect.soft(sources.get('Java')!.text).toContain(` + page.navigate(\"about:blank\"); + page.getByRole(AriaRole.TEXTBOX).click(); + page.getByRole(AriaRole.TEXTBOX).fill(\"h\"); + }`); + + expect.soft(sources.get('Python')!.text).toContain(` + page.goto("about:blank") + page.get_by_role("textbox").click() + page.get_by_role("textbox").fill("h") + + # --------------------- + context.close()`); + + expect.soft(sources.get('Python Async')!.text).toContain(` + await page.goto("about:blank") + await page.get_by_role("textbox").click() + await page.get_by_role("textbox").fill("h") + + # --------------------- + await context.close()`); + + expect.soft(sources.get('Pytest')!.text).toContain(` + page.goto("about:blank") + page.get_by_role("textbox").click() + page.get_by_role("textbox").fill("h")`); + + expect.soft(sources.get('C#')!.text).toContain(` +await page.GotoAsync("about:blank"); +await page.GetByRole(AriaRole.Textbox).ClickAsync(); +await page.GetByRole(AriaRole.Textbox).FillAsync("h");`); + + expect(page.url()).toContain('about:blank#foo'); + }); + test('should ignore AltGraph', async ({ openRecorder, browserName }) => { test.skip(browserName === 'firefox', 'The TextInputProcessor in Firefox does not work with AltGraph.'); const { recorder } = await openRecorder(); diff --git a/tests/library/inspector/inspectorTest.ts b/tests/library/inspector/inspectorTest.ts index b94bfc09a0..f5e3631b3a 100644 --- a/tests/library/inspector/inspectorTest.ts +++ b/tests/library/inspector/inspectorTest.ts @@ -218,6 +218,10 @@ export class Recorder { await this.page.mouse.up(options); } + async trustedPress(text: string) { + await this.page.keyboard.press(text); + } + async trustedDblclick() { await this.page.mouse.down(); await this.page.mouse.up();