issues/78/user_tool.py (98 lines of code) (raw):

import pytest import os from playwright.async_api import Page, expect, async_playwright from utils.trace_cleaner import trace_cleaner from utils.login import NEW_DOT_URL, sign_in from utils.browser import close_browser, start_browser STATIC_PREFIX = 53036 EXPENSIFY_USERNAME_FIRSTNAME = "osaidtest" EXPENSIFY_USERNAME_LASTNAME = "testaccount" EXPENSIFY_USERNAME = f"{EXPENSIFY_USERNAME_FIRSTNAME} {EXPENSIFY_USERNAME_LASTNAME}" EXPENSIFY_EMAIL_USERNAME = "osaidtest5" EXPENSIFY_EMAIL = f"osaidtest5+{STATIC_PREFIX}@gmail.com" EXPENSIFY_PASSWORD = "ntvd acej mmaa qqmd" DATA_DIR = "browser_context" WORKSPACE_NAME = "workspace1" SLOW_MO = 1000 NORMAL_RUN = False PROXY_SETTINGS = {"server": "http://localhost:8080"} SEARCH_QUERY = "type:expense status:all from:osaidtest5+530366@gmail.com to:osaidtest5+53036@gmail.com" SECOND_USER_USERNAME = 'second usr' async def sign_in_recorded(page: Page, email: str): await page.get_by_test_id("username").fill(email) await page.get_by_role("button", name="Continue").click() await page.get_by_test_id("validateCode").fill("123456") async def start_browser( headless=False, persistent=False, data_dir=None, slow_mo=500, launch_args=["--ignore-certificate-errors"], proxy=None, ): """ Start a browser instance with the given parameters. :param headless: Boolean to specify if the browser should run in headless mode. :param persistent: Boolean to specify if the browser context should be persistent. :param data_dir: Directory to store browser data for persistent context. :return: A tuple of (context, page, playwright). """ # Initialize Playwright playwright = await async_playwright().start() device = playwright.devices["Desktop Safari"] context, page = None, None if persistent: if data_dir is None: data_dir = "browser_context" if not os.path.exists(data_dir): os.makedirs(data_dir) context = await playwright.chromium.launch_persistent_context( data_dir, proxy=proxy, headless=headless, args=launch_args, slow_mo=slow_mo, timezone_id="Asia/Karachi", **device ) page = context.pages[0] else: browser = await playwright.chromium.launch( headless=headless, args=launch_args, slow_mo=slow_mo, proxy=proxy, ) context = await browser.new_context( ignore_https_errors=True, timezone_id="Asia/Karachi", permissions=["clipboard-read", "clipboard-write"], **device ) page = await context.new_page() return context, page, playwright # Return playwright to close later @pytest.mark.asyncio async def test_53036(): try: context, page, playwright = await start_browser( persistent=False, data_dir=DATA_DIR, headless=False, slow_mo=SLOW_MO, launch_args=[ "--ignore-certificate-errors", "--disable-web-security", "--disable-features=IsolateOrigins,site-per-process", ], proxy=PROXY_SETTINGS ) # Start tracing await context.tracing.start(screenshots=True, snapshots=True, sources=True) try: # Step 1: Sign in if NORMAL_RUN: # Normal test run await sign_in(page, EXPENSIFY_EMAIL, password=EXPENSIFY_PASSWORD) else: # Recorded Test Run. await page.goto(NEW_DOT_URL) await sign_in_recorded(page=page, email=EXPENSIFY_EMAIL) await page.get_by_test_id("CustomBottomTabNavigator").get_by_label("Search").click() # Cleanup (Reset Filters if present) await page.get_by_role("button", name="Filters").click() if await page.get_by_role("link", name="Reset filters").is_visible(): await page.get_by_role("link", name="Reset filters").click() await page.get_by_label("Back").click() await page.get_by_test_id("Search").get_by_label("Search").click() await page.get_by_test_id("search-router-text-input").fill(SEARCH_QUERY) await page.get_by_test_id("search-router-text-input").press("Enter") await page.get_by_role("button", name="Filters").click() # Assert that the filters are correctly applied. await expect(page.get_by_test_id("SearchAdvancedFiltersPage").get_by_text(SECOND_USER_USERNAME)).to_be_visible() await expect(page.get_by_test_id("SearchAdvancedFiltersPage").get_by_text(EXPENSIFY_USERNAME)).to_be_visible() await expect(page.get_by_role("button", name="Save search")).to_be_visible() finally: # Stop tracing and export the trace file, then clean the trace await context.tracing.stop(path="/app/expensify/user_tool/output_browser1.zip") trace_cleaner("/app/expensify/user_tool/output_browser1.zip") finally: # Step 6: Close the browser. await close_browser(context, page, playwright)