diff --git a/.changeset/neat-walls-walk.md b/.changeset/neat-walls-walk.md new file mode 100644 index 000000000..bd88aa32e --- /dev/null +++ b/.changeset/neat-walls-walk.md @@ -0,0 +1,5 @@ +--- +"@browserbasehq/stagehand-lib": patch +--- + +Fixed small issue with module-level state guard for the Playwright selectors.register call diff --git a/lib/StagehandPage.ts b/lib/StagehandPage.ts index e4fd45dfb..b34a2f302 100644 --- a/lib/StagehandPage.ts +++ b/lib/StagehandPage.ts @@ -38,9 +38,6 @@ async function getCurrentRootFrameId(session: CDPSession): Promise { return frameTree.frame.id; } -/** ensure we register the custom selector only once per process */ -let stagehandSelectorRegistered = false; - export class StagehandPage { private stagehand: Stagehand; private rawPage: PlaywrightPage; @@ -197,10 +194,7 @@ ${scriptContent} \ /** Register the custom selector engine that pierces open/closed shadow roots. */ private async ensureStagehandSelectorEngine(): Promise { - if (stagehandSelectorRegistered) return; - stagehandSelectorRegistered = true; - - await selectors.register("stagehand", () => { + const registerFn = () => { type Backdoor = { getClosedRoot?: (host: Element) => ShadowRoot | undefined; }; @@ -299,7 +293,20 @@ ${scriptContent} \ return out; }, }; - }); + }; + + try { + await selectors.register("stagehand", registerFn); + } catch (err) { + if ( + err instanceof Error && + err.message.match(/selector engine has been already registered/) + ) { + // ignore + } else { + throw err; + } + } } /**