5
5
6
6
7
7
import json
8
+ import os
8
9
import random
9
10
import uuid
10
11
from locust import HttpUser , task , between
12
+ from locust_plugins .users .playwright import PlaywrightUser , pw , PageWithRetry , event
11
13
12
14
from opentelemetry import context , baggage , trace
13
15
from opentelemetry .metrics import set_meter_provider
21
23
from opentelemetry .instrumentation .requests import RequestsInstrumentor
22
24
from opentelemetry .instrumentation .system_metrics import SystemMetricsInstrumentor
23
25
from opentelemetry .instrumentation .urllib3 import URLLib3Instrumentor
26
+ from playwright .async_api import Route , Request
24
27
25
28
exporter = OTLPMetricExporter (insecure = True )
26
29
set_meter_provider (MeterProvider ([PeriodicExportingMetricReader (exporter )]))
@@ -130,3 +133,42 @@ def on_start(self):
130
133
context .attach (ctx )
131
134
self .index ()
132
135
136
+
137
+ browser_traffic_enabled = os .environ .get ('LOCUST_BROWSER_TRAFFIC_ENABLED' , False )
138
+
139
+ if browser_traffic_enabled :
140
+ class WebsiteBrowserUser (PlaywrightUser ):
141
+ headless = True # to use a headless browser, without a GUI
142
+
143
+ @task
144
+ @pw
145
+ async def open_cart_page_and_change_currency (self , page : PageWithRetry ):
146
+ try :
147
+ page .on ("console" , lambda msg : print (msg .text ))
148
+ await page .route ('**/*' , add_baggage_header )
149
+ await page .goto ("/cart" , wait_until = "domcontentloaded" )
150
+ await page .select_option ('[name="currency_code"]' , 'CHF' )
151
+ await page .wait_for_timeout (2000 ) # giving the browser time to export the traces
152
+ except :
153
+ pass
154
+
155
+ @task
156
+ @pw
157
+ async def add_product_to_cart (self , page : PageWithRetry ):
158
+ try :
159
+ page .on ("console" , lambda msg : print (msg .text ))
160
+ await page .route ('**/*' , add_baggage_header )
161
+ await page .goto ("/" , wait_until = "domcontentloaded" )
162
+ await page .click ('p:has-text("Roof Binoculars")' , wait_until = "domcontentloaded" )
163
+ await page .click ('button:has-text("Add To Cart")' , wait_until = "domcontentloaded" )
164
+ await page .wait_for_timeout (2000 ) # giving the browser time to export the traces
165
+ except :
166
+ pass
167
+
168
+
169
+ async def add_baggage_header (route : Route , request : Request ):
170
+ headers = {
171
+ ** request .headers ,
172
+ 'baggage' : 'synthetic_request=true'
173
+ }
174
+ await route .continue_ (headers = headers )
0 commit comments