22
22
from wrapt import wrap_function_wrapper
23
23
24
24
try :
25
- from playwright .async_api import Browser
26
- from playwright .sync_api import Browser as SyncBrowser
25
+ from playwright .async_api import Browser , BrowserContext
26
+ from playwright .sync_api import (
27
+ Browser as SyncBrowser ,
28
+ BrowserContext as SyncBrowserContext ,
29
+ )
27
30
except ImportError as e :
28
31
raise ImportError (
29
32
f"Attempted to import { __file__ } , but it is designed "
@@ -84,8 +87,12 @@ def _wrap_new_browser_sync(
84
87
set_span_in_context (span , get_current ())
85
88
_context_spans [id (context )] = span
86
89
span .set_attribute ("lmnr.internal.has_browser_session" , True )
90
+ trace_id = format (span .get_span_context ().trace_id , "032x" )
91
+ context .on (
92
+ "page" ,
93
+ lambda page : handle_navigation_sync (page , session_id , trace_id , client ),
94
+ )
87
95
for page in context .pages :
88
- trace_id = format (span .get_span_context ().trace_id , "032x" )
89
96
handle_navigation_sync (page , session_id , trace_id , client )
90
97
return browser
91
98
@@ -106,12 +113,67 @@ async def _wrap_new_browser_async(
106
113
set_span_in_context (span , get_current ())
107
114
_context_spans [id (context )] = span
108
115
span .set_attribute ("lmnr.internal.has_browser_session" , True )
116
+ trace_id = format (span .get_span_context ().trace_id , "032x" )
117
+
118
+ async def handle_page_navigation (page ):
119
+ return await handle_navigation_async (page , session_id , trace_id , client )
120
+
121
+ context .on ("page" , handle_page_navigation )
109
122
for page in context .pages :
110
- trace_id = format (span .get_span_context ().trace_id , "032x" )
111
123
await handle_navigation_async (page , session_id , trace_id , client )
112
124
return browser
113
125
114
126
127
+ @with_tracer_and_client_wrapper
128
+ def _wrap_new_context_sync (
129
+ tracer : Tracer , client : LaminarClient , to_wrap , wrapped , instance , args , kwargs
130
+ ):
131
+ context : SyncBrowserContext = wrapped (* args , ** kwargs )
132
+ session_id = str (uuid .uuid4 ().hex )
133
+ span = get_current_span ()
134
+ if span == INVALID_SPAN :
135
+ span = tracer .start_span (
136
+ name = f"{ to_wrap .get ('object' )} .{ to_wrap .get ('method' )} "
137
+ )
138
+ set_span_in_context (span , get_current ())
139
+ _context_spans [id (context )] = span
140
+ span .set_attribute ("lmnr.internal.has_browser_session" , True )
141
+ trace_id = format (span .get_span_context ().trace_id , "032x" )
142
+
143
+ context .on (
144
+ "page" ,
145
+ lambda page : handle_navigation_sync (page , session_id , trace_id , client ),
146
+ )
147
+ for page in context .pages :
148
+ handle_navigation_sync (page , session_id , trace_id , client )
149
+ return context
150
+
151
+
152
+ @with_tracer_and_client_wrapper
153
+ async def _wrap_new_context_async (
154
+ tracer : Tracer , client : AsyncLaminarClient , to_wrap , wrapped , instance , args , kwargs
155
+ ):
156
+ context : SyncBrowserContext = await wrapped (* args , ** kwargs )
157
+ session_id = str (uuid .uuid4 ().hex )
158
+ span = get_current_span ()
159
+ if span == INVALID_SPAN :
160
+ span = tracer .start_span (
161
+ name = f"{ to_wrap .get ('object' )} .{ to_wrap .get ('method' )} "
162
+ )
163
+ set_span_in_context (span , get_current ())
164
+ _context_spans [id (context )] = span
165
+ span .set_attribute ("lmnr.internal.has_browser_session" , True )
166
+ trace_id = format (span .get_span_context ().trace_id , "032x" )
167
+
168
+ async def handle_page_navigation (page ):
169
+ return await handle_navigation_async (page , session_id , trace_id , client )
170
+
171
+ context .on ("page" , handle_page_navigation )
172
+ for page in context .pages :
173
+ await handle_navigation_async (page , session_id , trace_id , client )
174
+ return context
175
+
176
+
115
177
@with_tracer_and_client_wrapper
116
178
def _wrap_close_browser_sync (
117
179
tracer : Tracer ,
@@ -191,6 +253,18 @@ async def _wrap_close_browser_async(
191
253
"method" : "close" ,
192
254
"wrapper" : _wrap_close_browser_sync ,
193
255
},
256
+ {
257
+ "package" : "playwright.sync_api" ,
258
+ "object" : "Browser" ,
259
+ "method" : "new_context" ,
260
+ "wrapper" : _wrap_new_context_sync ,
261
+ },
262
+ {
263
+ "package" : "playwright.sync_api" ,
264
+ "object" : "BrowserType" ,
265
+ "method" : "launch_persistent_context" ,
266
+ "wrapper" : _wrap_new_context_sync ,
267
+ },
194
268
]
195
269
196
270
WRAPPED_METHODS_ASYNC = [
@@ -230,6 +304,18 @@ async def _wrap_close_browser_async(
230
304
"method" : "close" ,
231
305
"wrapper" : _wrap_close_browser_async ,
232
306
},
307
+ {
308
+ "package" : "playwright.async_api" ,
309
+ "object" : "Browser" ,
310
+ "method" : "new_context" ,
311
+ "wrapper" : _wrap_new_context_async ,
312
+ },
313
+ {
314
+ "package" : "playwright.sync_api" ,
315
+ "object" : "BrowserType" ,
316
+ "method" : "launch_persistent_context" ,
317
+ "wrapper" : _wrap_new_context_sync ,
318
+ },
233
319
]
234
320
235
321
0 commit comments