issues/41/user_tool.py (62 lines of code) (raw):
from playwright.sync_api import sync_playwright
from utils.trace_cleaner import trace_cleaner
user_email = "testuserexpensify1@gmail.com"
password = ""
user_id = "testuserexpensify1+153@gmail.com"
didUIBlink = False
def login(p, if_phone=False, first_name="John", last_name="Doe"):
# step 1: Login
permissions = ['clipboard-read']
browser = p.chromium.launch(headless=False, slow_mo=500, args=["--disable-web-security", "--disable-features=IsolateOrigins,site-per-process"])
if if_phone:
phone = p.devices['iPhone 12 Pro']
context = browser.new_context(**phone, permissions=permissions, reduced_motion='no-preference')
else:
context = browser.new_context()
page = context.new_page()
page.goto('https://dev.new.expensify.com:8082/')
phone_or_email_input = page.locator('input[type="email"]')
phone_or_email_input.fill(user_id)
continue_button = page.locator('button[tabindex="0"]')
continue_button.click()
magic_code = "123456"
validate_code_input = page.locator('input[name="validateCode"]')
validate_code_input.fill(magic_code)
return browser, page
def test_51128():
with sync_playwright() as p:
browser, page = login(p, False)
context = page.context
# Start tracing with screenshots, snapshots and sources
context.tracing.start(screenshots=True, snapshots=True, sources=True)
try:
chat_name = "testuser somasundar"
amount = "1"
try:
page.get_by_text("Got it").click(timeout=2000)
except:
pass
# Navigate to the chat
page.get_by_label("Navigates to a chat").get_by_text(chat_name, exact=True).click()
# Perform the first invoice action
page.locator('button[aria-label="Create"]').click()
page.locator('div[aria-label="Send invoice"][role="menuitem"]').click()
page.locator('input[role="presentation"]').fill(amount)
page.get_by_test_id("IOURequestStartPage").get_by_text("Next").click()
page.get_by_test_id("IOURequestStepConfirmation").get_by_text("Send ₹").click()
# Capture initial count of chat messages
initialcount = page.get_by_test_id("report-actions-list").last.locator('div[aria-label="Chat message"]', has_text="Today at").count()
print(f"Initial message count: {initialcount}")
try:
page.get_by_text("Got it").click(timeout=2000)
except:
pass
# Perform the second invoice action
page.locator('button[aria-label="Create"]').click()
page.locator('div[aria-label="Send invoice"][role="menuitem"]').click()
page.locator('input[role="presentation"]').fill(amount)
page.get_by_test_id("IOURequestStartPage").get_by_text("Next").click()
noBlinks = page.evaluate("""
(() => {
return new Promise((resolve) => {
let reportActionsLists = document.querySelectorAll('[data-testid="report-actions-list"]');
if (reportActionsLists.length === 0) resolve(false); // Fail-safe if no elements found
let lastReportActionsList = reportActionsLists[reportActionsLists.length - 1];
// Function to count messages that contain "Today at"
const getMessageCount = () => {
let messages = lastReportActionsList.querySelectorAll('div[aria-label="Chat message"]');
return Array.from(messages).filter(msg => msg.innerText.includes("Today at")).length;
};
let countBefore = getMessageCount(); // Get initial count
let noBlinks = true;
// Check message count every 10ms
let checkInterval = setInterval(() => {
let countDuring = getMessageCount();
if (countDuring !== countBefore) {
noBlinks = false;
}
}, 10);
setTimeout(() => {
clearInterval(checkInterval); // Stop interval after 3 seconds and return final count
resolve(noBlinks); // Return state of noBlinks variable
}, 3000);
let container = document.querySelector('[data-testid="IOURequestStepConfirmation"]');
if (!container) return;
let button = Array.from(container.querySelectorAll('button'))
.find(btn => btn.innerText.includes("Send ₹"));
if (button) {
button.click();
} else {
noBlinks = false; //If no button found, test should fail
}
});
})();
""")
assert noBlinks, "The invoice preview sender appears then disappears when sending invoices consecutively."
finally:
# Stop tracing, export the trace file, run trace cleaner, and close the browser
trace_file = "/app/expensify/user_tool/output_browser1.zip"
context.tracing.stop(path=trace_file)
trace_cleaner(trace_file)
browser.close()
if __name__ == "__main__":
test_51128()