issues/83/user_tool.py (122 lines of code) (raw):

from playwright.sync_api import sync_playwright, expect from playwright.sync_api._context_manager import PlaywrightContextManager from playwright._impl._browser import Browser from playwright._impl._page import Page from utils.trace_cleaner import trace_cleaner # Utility to generate an email def generate_email(): timestamp = '639000' return f"freelanceapptest+{timestamp}@gmail.com" # Function to log in the user and complete onboarding steps def login_user(p: PlaywrightContextManager, first_name="Milan", last_name="T") -> tuple[Browser, Page, str]: # Launch Chromium and open a new page browser = p.chromium.launch( proxy={"server": "http://localhost:8080"}, headless=False, args=["--no-sandbox", "--disable-dev-shm-usage", "--ignore-certificate-errors", "--disable-web-security", "--disable-features=IsolateOrigins,site-per-process"], slow_mo=200, channel="chromium") context = browser.new_context(ignore_https_errors=True) page = context.new_page() user_email = generate_email() # Step 1: Open the Expensify URL page.goto('https://dev.new.expensify.com:8082/') # Step 2: Enter a generated email and click continue page.locator('input[type="email"]').fill(user_email) page.locator('button[tabindex="0"]').click() page.wait_for_timeout(1000) # Step 3: Click the join button if available, otherwise skip try: page.locator('button[tabindex="0"]').click() page.wait_for_timeout(1000) except Exception: pass # Step 4: Ensure that the user reaches the dashboard by checking for visible text expect(page.locator("text=What do you want to do today?")).to_be_visible() # Step 5: Select 'Track and budget expenses' in the onboarding page and click Continue page.locator("text='Track and budget expenses'").click() page.wait_for_timeout(1000) # Step 6: Enter first name, last name, and continue page.locator('input[name="fname"]').fill(first_name) page.locator('input[name="lname"]').fill(last_name) page.get_by_role("button", name="Continue").last.click() page.wait_for_timeout(1000) return browser, page def test_multiple_selector_in_workspace(): with sync_playwright() as p: # A list to store any assertion failures so we can print them at the end errors = [] # Step 1: Login user browser, page = login_user(p) context = page.context # Start tracing context.tracing.start(screenshots=True, snapshots=True, sources=True) try: # Navigate to Workspaces settings page.get_by_label("My settings").click() page.get_by_test_id("InitialSettingsPage").get_by_label("Workspaces").get_by_text("Workspaces").click() page.get_by_label("New workspace").click() page.get_by_text("More features").click() page.get_by_label("Classify costs and track").click() page.get_by_label("Document and reclaim eligible").click() page.get_by_label("Set up custom fields for").click() page.get_by_role("button", name="Upgrade").click() page.wait_for_timeout(1000) page.get_by_role("button", name="Got it, thanks").click() # --- Categories Section --- page.get_by_test_id("WorkspaceInitialPage").get_by_text("Categories").click() page.locator("#Benefits").get_by_label("Benefits").click() page.wait_for_timeout(1000) page.locator("#Advertising").get_by_label("Advertising").click() page.wait_for_timeout(1000) page.locator("#Car").get_by_label("Car").click() assert page.get_by_role("button", name="selected").is_visible() # Check button is green button_locator = page.get_by_role("button", name="selected") # Evaluate the element's inline style for backgroundColor actual_bg_color = button_locator.evaluate("el => el.style.backgroundColor") # Assert or compare with the expected value try: # If the element truly has inline style: background-color: rgb(3, 212, 124); # you should see "rgb(3, 212, 124)" in actual_bg_color. assert actual_bg_color == "rgb(3, 212, 124)", ( f"Expected inline backgroundColor to be 'rgb(3, 212, 124)' in Categories, " f"but got '{actual_bg_color}'\n" ) except AssertionError as e: errors.append(str(e)) page.wait_for_timeout(1000) # --- Tags Section --- page.get_by_test_id("WorkspaceInitialPage").get_by_text("Tags").click() page.get_by_role("button", name="Add tag").click() page.get_by_role("textbox", name="Name").fill("To pay") page.get_by_role("button", name="Save").click() page.locator("button").filter(has_text="To payEnabled").get_by_label("To pay").click() # Check button is green button_locator = page.get_by_role("button", name="selected") # Evaluate the element's inline style for backgroundColor actual_bg_color = button_locator.evaluate("el => el.style.backgroundColor") # Assert or compare with the expected value try: # If the element truly has inline style: background-color: rgb(3, 212, 124); # you should see "rgb(3, 212, 124)" in actual_bg_color. assert actual_bg_color == "rgb(3, 212, 124)", ( f"Expected inline backgroundColor to be 'rgb(3, 212, 124)' in Tags, " f"but got '{actual_bg_color}'\n" ) except AssertionError as e: errors.append(str(e)) page.wait_for_timeout(1000) # --- Taxes Section --- page.get_by_test_id("WorkspaceInitialPage").get_by_text("Taxes").click() page.locator("#id_TAX_RATE_1").get_by_label("Tax Rate").click() # Check button is green button_locator = page.get_by_role("button", name="selected") # Evaluate the element's inline style for backgroundColor actual_bg_color = button_locator.evaluate("el => el.style.backgroundColor") # Assert or compare with the expected value try: # If the element truly has inline style: background-color: rgb(3, 212, 124); # you should see "rgb(3, 212, 124)" in actual_bg_color. assert actual_bg_color == "rgb(3, 212, 124)", ( f"Expected inline backgroundColor to be 'rgb(3, 212, 124)' in Taxes, " f"but got '{actual_bg_color}'\n" ) except AssertionError as e: errors.append(str(e)) page.wait_for_timeout(1000) # --- Report Fields Section --- page.get_by_test_id("WorkspaceInitialPage").get_by_text("Report fields").click() page.get_by_role("button", name="Add field").click() page.get_by_test_id("CreateReportFieldsPage").get_by_text("Name").click() page.get_by_role("textbox", name="Name").fill("to pay") page.get_by_test_id("TextSelectorModal").get_by_role("button", name="Save").click() page.get_by_test_id("CreateReportFieldsPage").get_by_text("Type").click() page.get_by_label("Text").click() page.get_by_text("Initial value").click() page.get_by_role("textbox", name="Initial value").fill("none") page.get_by_test_id("TextSelectorModal").get_by_role("button", name="Save").click() page.get_by_role("button", name="Save").nth(0).click() page.locator("#field_id_TO_PAY").get_by_label("to pay").click() # Check button is green button_locator = page.get_by_role("button", name="selected") # Evaluate the element's inline style for backgroundColor actual_bg_color = button_locator.evaluate("el => el.style.backgroundColor") # Assert or compare with the expected value try: # If the element truly has inline style: background-color: rgb(3, 212, 124); # you should see "rgb(3, 212, 124)" in actual_bg_color. assert actual_bg_color == "rgb(3, 212, 124)", ( f"Expected inline backgroundColor to be 'rgb(3, 212, 124)' in Reports fields, " f"but got '{actual_bg_color}'\n" ) except AssertionError as e: errors.append(str(e)) page.wait_for_timeout(1000) assert not errors, "\n".join(errors) finally: # Stop tracing and export the trace file trace_path = "/app/expensify/user_tool/output_browser1.zip" context.tracing.stop(path=trace_path) trace_cleaner(trace_path) browser.close() if __name__ == '__main__': test_multiple_selector_in_workspace()