issues/23/user_tool.py (62 lines of code) (raw):

from playwright.sync_api import sync_playwright from utils.trace_cleaner import trace_cleaner # Expensify app URL EXPENSIFY_URL = "https://dev.new.expensify.com:8082/" # Email login credentials EMAIL_USERNAME = "naturesv057+54767_1@gmail.com" def launch_browser(pw, device=None, geolocation=None): """ Launch the browser. """ browser = pw.chromium.launch( headless=False, proxy={"server": "http://127.0.0.1:8080/"}, args=[ "--ignore-certificate-errors", "--disable-web-security", "--disable-features=IsolateOrigins,site-per-process", ], slow_mo=500 ) context_args = {} if device: context_args.update(pw.devices[device]) if geolocation: context_args["geolocation"] = geolocation context_args["permissions"] = ["geolocation"] context = browser.new_context(**context_args) page = context.new_page() return browser, context, page def login_user(page): """ Login to the Expensify app and complete the onboarding. """ # Open the Expensify app page.goto(EXPENSIFY_URL) # Login user page.get_by_role("textbox", name="Phone or email").fill(EMAIL_USERNAME) page.locator("div", has_text="Continue").last.click() # Get the OTP code otp = "123456" # Enter the OTP code page.keyboard.type(otp) def test_54767(): with sync_playwright() as p: browser, context, page = launch_browser(p) # Start tracing with screenshots, snapshots and sources context.tracing.start(screenshots=True, snapshots=True, sources=True) try: # Step 1: Login user login_user(page) page.wait_for_timeout(2000) # Connect to Chrome DevTools Protocol (CDP) session = context.new_cdp_session(page) # Set CPU Throttling session.send("Emulation.setCPUThrottlingRate", {"rate": 6}) # 6x CPU slowdown # Set Network Throttling (Slow 3G) session.send("Network.emulateNetworkConditions", { "offline": False, "latency": 400, # 400ms (Slow 3G) "downloadThroughput": 400 * 1024, # 400 kbps "uploadThroughput": 150 * 1024 # 150 kbps }) # Step 2: Reintroduce scenario page.get_by_label("My settings").click() page.get_by_label("Wallet").click() page.wait_for_timeout(2000) page.locator("body").press("ControlOrMeta+d") page.wait_for_timeout(2000) page.get_by_label("Force offline").click() page.wait_for_timeout(2000) # Step 3: Check if the issue is resolved button = page.locator("button[aria-label='Force offline']") # Locate the button aria_checked = button.get_attribute("aria-checked") # Get the value of aria-checked assert aria_checked == "true", f"aria-checked is {aria_checked}, expected 'true'" finally: trace_path = "/app/expensify/user_tool/output_browser1.zip" # Stop tracing and export the trace file context.tracing.stop(path=trace_path) # Clean the trace file using trace_cleaner trace_cleaner(trace_path) # Close the browser browser.close() if __name__ == '__main__': test_54767()