|
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