From 10d885518c1b3fead04b39f76f9291865c633cb6 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 19:44:31 +0000 Subject: [PATCH 1/2] fix: handle navigation timing in page.evaluate calls Co-Authored-By: Razvan Marescu --- .../shortest/src/browser/actions/index.ts | 10 +++++ .../shortest/src/browser/core/browser-tool.ts | 40 +++++++------------ 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/packages/shortest/src/browser/actions/index.ts b/packages/shortest/src/browser/actions/index.ts index 65dc776e..2d75cdd1 100644 --- a/packages/shortest/src/browser/actions/index.ts +++ b/packages/shortest/src/browser/actions/index.ts @@ -68,8 +68,18 @@ export async function click(page: Page, x: number, y: number): Promise { const scaledY = Math.round(y * scaleRatio.y); await mouseMove(page, x, y); + + // Start navigation promise before clicking + const navigationPromise = page.waitForNavigation({ + waitUntil: 'domcontentloaded', + timeout: 5000 + }).catch(() => {}); // Ignore timeout + await page.mouse.click(scaledX, scaledY); await showClickAnimation(page, "left"); + + // Wait for navigation if it started + await navigationPromise; } export async function dragMouse( diff --git a/packages/shortest/src/browser/core/browser-tool.ts b/packages/shortest/src/browser/core/browser-tool.ts index e234b787..04b24741 100644 --- a/packages/shortest/src/browser/core/browser-tool.ts +++ b/packages/shortest/src/browser/core/browser-tool.ts @@ -227,27 +227,8 @@ export class BrowserTool extends BaseBrowserTool { await this.clickAtCoordinates(clickCoords[0], clickCoords[1]); output = `${input.action} at (${clickCoords[0]}, ${clickCoords[1]})`; - // Get initial metadata before potential navigation + // Get metadata after navigation is complete metadata = await this.getMetadata(); - - // Wait briefly for navigation to start - await this.page.waitForTimeout(100); - - // If navigation started, get updated metadata - if ( - await this.page - .evaluate(() => document.readyState !== "complete") - .catch(() => true) - ) { - try { - await this.page.waitForLoadState("domcontentloaded", { - timeout: 5000, - }); - metadata = await this.getMetadata(); - } catch { - // Keep the initial metadata if navigation timeout - } - } break; } @@ -642,13 +623,20 @@ export class BrowserTool extends BaseBrowserTool { }, }; - // Only try to get cursor position if page is stable + // Only try to get cursor position if page is stable and not navigating if (await this.isPageStable()) { - const position = await actions.getCursorPosition(this.page); - metadata.cursor_info = { - position, - visible: this.cursorVisible, - }; + try { + const position = await actions.getCursorPosition(this.page); + metadata.cursor_info = { + position, + visible: this.cursorVisible, + }; + } catch (error: unknown) { + // Ignore cursor errors during navigation + if (error instanceof Error && !error.message.includes('context was destroyed')) { + throw error; + } + } } return metadata; From 9b1c225818a08ec3298ef46f0bf01cf345b345bc Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Tue, 11 Feb 2025 19:45:24 +0000 Subject: [PATCH 2/2] [autofix.ci] apply automated fixes --- packages/shortest/src/browser/actions/index.ts | 16 +++++++++------- .../shortest/src/browser/core/browser-tool.ts | 5 ++++- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/shortest/src/browser/actions/index.ts b/packages/shortest/src/browser/actions/index.ts index 2d75cdd1..5039a528 100644 --- a/packages/shortest/src/browser/actions/index.ts +++ b/packages/shortest/src/browser/actions/index.ts @@ -68,16 +68,18 @@ export async function click(page: Page, x: number, y: number): Promise { const scaledY = Math.round(y * scaleRatio.y); await mouseMove(page, x, y); - + // Start navigation promise before clicking - const navigationPromise = page.waitForNavigation({ - waitUntil: 'domcontentloaded', - timeout: 5000 - }).catch(() => {}); // Ignore timeout - + const navigationPromise = page + .waitForNavigation({ + waitUntil: "domcontentloaded", + timeout: 5000, + }) + .catch(() => {}); // Ignore timeout + await page.mouse.click(scaledX, scaledY); await showClickAnimation(page, "left"); - + // Wait for navigation if it started await navigationPromise; } diff --git a/packages/shortest/src/browser/core/browser-tool.ts b/packages/shortest/src/browser/core/browser-tool.ts index 04b24741..f1cc15c8 100644 --- a/packages/shortest/src/browser/core/browser-tool.ts +++ b/packages/shortest/src/browser/core/browser-tool.ts @@ -633,7 +633,10 @@ export class BrowserTool extends BaseBrowserTool { }; } catch (error: unknown) { // Ignore cursor errors during navigation - if (error instanceof Error && !error.message.includes('context was destroyed')) { + if ( + error instanceof Error && + !error.message.includes("context was destroyed") + ) { throw error; } }