@@ -28,10 +28,10 @@ async def create_stagehand_page(self, pw_page: Page) -> StagehandPage:
28
28
stagehand_page = StagehandPage (pw_page , self .stagehand , self )
29
29
await self .inject_custom_scripts (pw_page )
30
30
self .page_map [pw_page ] = stagehand_page
31
-
31
+
32
32
# Initialize frame tracking for this page
33
33
await self ._attach_frame_navigated_listener (pw_page , stagehand_page )
34
-
34
+
35
35
return stagehand_page
36
36
37
37
async def inject_custom_scripts (self , pw_page : Page ):
@@ -78,25 +78,18 @@ def get_active_page(self) -> StagehandPage:
78
78
def register_frame_id (self , frame_id : str , page : StagehandPage ):
79
79
"""Register a frame ID to StagehandPage mapping."""
80
80
self .frame_id_map [frame_id ] = page
81
- self .stagehand .logger .debug (
82
- f"Registered frame ID { frame_id } to page" , category = "context"
83
- )
84
81
85
82
def unregister_frame_id (self , frame_id : str ):
86
83
"""Unregister a frame ID from the mapping."""
87
84
if frame_id in self .frame_id_map :
88
85
del self .frame_id_map [frame_id ]
89
- self .stagehand .logger .debug (
90
- f"Unregistered frame ID { frame_id } " , category = "context"
91
- )
92
86
93
87
def get_stagehand_page_by_frame_id (self , frame_id : str ) -> StagehandPage :
94
88
"""Get StagehandPage by frame ID."""
95
89
return self .frame_id_map .get (frame_id )
96
90
97
91
@classmethod
98
92
async def init (cls , context : BrowserContext , stagehand ):
99
- stagehand .logger .debug ("StagehandContext.init() called" , category = "context" )
100
93
instance = cls (context , stagehand )
101
94
# Pre-initialize StagehandPages for any existing pages
102
95
stagehand .logger .debug (
@@ -176,7 +169,9 @@ async def wrapped_pages():
176
169
return wrapped_pages
177
170
return attr
178
171
179
- async def _attach_frame_navigated_listener (self , pw_page : Page , stagehand_page : StagehandPage ):
172
+ async def _attach_frame_navigated_listener (
173
+ self , pw_page : Page , stagehand_page : StagehandPage
174
+ ):
180
175
"""
181
176
Attach CDP listener for frame navigation events to track frame IDs.
182
177
This mirrors the TypeScript implementation's frame tracking.
@@ -185,55 +180,55 @@ async def _attach_frame_navigated_listener(self, pw_page: Page, stagehand_page:
185
180
# Create CDP session for the page
186
181
cdp_session = await self ._context .new_cdp_session (pw_page )
187
182
await cdp_session .send ("Page.enable" )
188
-
183
+
189
184
# Get the current root frame ID
190
185
frame_tree = await cdp_session .send ("Page.getFrameTree" )
191
186
root_frame_id = frame_tree .get ("frameTree" , {}).get ("frame" , {}).get ("id" )
192
-
187
+
193
188
if root_frame_id :
194
189
# Initialize the page with its frame ID
195
190
stagehand_page .update_root_frame_id (root_frame_id )
196
191
self .register_frame_id (root_frame_id , stagehand_page )
197
-
192
+
198
193
# Set up event listener for frame navigation
199
194
def on_frame_navigated (params ):
200
195
"""Handle Page.frameNavigated events"""
201
196
frame = params .get ("frame" , {})
202
197
frame_id = frame .get ("id" )
203
198
parent_id = frame .get ("parentId" )
204
-
199
+
205
200
# Only track root frames (no parent)
206
201
if not parent_id and frame_id :
207
202
# Skip if it's the same frame ID
208
203
if frame_id == stagehand_page .frame_id :
209
204
return
210
-
205
+
211
206
# Unregister old frame ID if exists
212
207
old_id = stagehand_page .frame_id
213
208
if old_id :
214
209
self .unregister_frame_id (old_id )
215
-
210
+
216
211
# Register new frame ID
217
212
self .register_frame_id (frame_id , stagehand_page )
218
213
stagehand_page .update_root_frame_id (frame_id )
219
-
214
+
220
215
self .stagehand .logger .debug (
221
216
f"Frame navigated from { old_id } to { frame_id } " ,
222
- category = "context"
217
+ category = "context" ,
223
218
)
224
-
219
+
225
220
# Register the event listener
226
221
cdp_session .on ("Page.frameNavigated" , on_frame_navigated )
227
-
222
+
228
223
# Clean up frame ID when page closes
229
224
def on_page_close ():
230
225
if stagehand_page .frame_id :
231
226
self .unregister_frame_id (stagehand_page .frame_id )
232
-
227
+
233
228
pw_page .once ("close" , on_page_close )
234
-
229
+
235
230
except Exception as e :
236
231
self .stagehand .logger .error (
237
232
f"Failed to attach frame navigation listener: { str (e )} " ,
238
- category = "context"
233
+ category = "context" ,
239
234
)
0 commit comments