Skip to content

Commit 455b61f

Browse files
Don't rely on module-level state for Playwright selector engine regis… (#1027)
detailed description [here](#1022) Co-authored-by: lucas-felicity <[email protected]>
1 parent 2633d82 commit 455b61f

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

.changeset/neat-walls-walk.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@browserbasehq/stagehand-lib": patch
3+
---
4+
5+
Fixed small issue with module-level state guard for the Playwright selectors.register call

lib/StagehandPage.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,6 @@ async function getCurrentRootFrameId(session: CDPSession): Promise<string> {
3838
return frameTree.frame.id;
3939
}
4040

41-
/** ensure we register the custom selector only once per process */
42-
let stagehandSelectorRegistered = false;
43-
4441
export class StagehandPage {
4542
private stagehand: Stagehand;
4643
private rawPage: PlaywrightPage;
@@ -197,10 +194,7 @@ ${scriptContent} \
197194

198195
/** Register the custom selector engine that pierces open/closed shadow roots. */
199196
private async ensureStagehandSelectorEngine(): Promise<void> {
200-
if (stagehandSelectorRegistered) return;
201-
stagehandSelectorRegistered = true;
202-
203-
await selectors.register("stagehand", () => {
197+
const registerFn = () => {
204198
type Backdoor = {
205199
getClosedRoot?: (host: Element) => ShadowRoot | undefined;
206200
};
@@ -299,7 +293,20 @@ ${scriptContent} \
299293
return out;
300294
},
301295
};
302-
});
296+
};
297+
298+
try {
299+
await selectors.register("stagehand", registerFn);
300+
} catch (err) {
301+
if (
302+
err instanceof Error &&
303+
err.message.match(/selector engine has been already registered/)
304+
) {
305+
// ignore
306+
} else {
307+
throw err;
308+
}
309+
}
303310
}
304311

305312
/**

0 commit comments

Comments
 (0)