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)