diff --git a/energy-tests/helpers/helper_functions.py b/energy-tests/helpers/helper_functions.py new file mode 100644 index 00000000..13607e87 --- /dev/null +++ b/energy-tests/helpers/helper_functions.py @@ -0,0 +1,30 @@ +import random +from time import time_ns, sleep +from playwright.sync_api import TimeoutError + + +def login(page, username='Crash', password='Override'): + page.goto("http://nc/login") + page.locator('#user').fill(username) + page.locator('#password').fill(password) + page.locator('#password').press("Enter") + + +def get_random_text() -> str: + size_in_bytes = 1024 + characters = string.ascii_letters + string.digits + return ''.join(random.choice(characters) for _ in range(size_in_bytes)) + +def log_note(message: str) -> None: + timestamp = str(time_ns())[:16] + print(f"{timestamp} {message}") + + +def close_modal(page) -> None: + with contextlib.suppress(TimeoutError): + sleep(5) # Sleep to make sure the modal has time to appear before continuing navigation + page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]', timeout=15_000).click() + + +def timeout_handler(signum, frame): + raise TimeoutError("Page.content() timed out") diff --git a/energy-tests/nextcloud_create_doc_and_share.py b/energy-tests/nextcloud_create_doc_and_share.py index 7fcdc476..061daa6e 100644 --- a/energy-tests/nextcloud_create_doc_and_share.py +++ b/energy-tests/nextcloud_create_doc_and_share.py @@ -3,14 +3,10 @@ import sys from time import sleep, time_ns import signal -from playwright.sync_api import Playwright, sync_playwright, TimeoutError +from playwright.sync_api import Playwright, sync_playwright -def timeout_handler(signum, frame): - raise TimeoutError("Page.content() timed out") +from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler -def log_note(message: str) -> None: - timestamp = str(time_ns())[:16] - print(f"{timestamp} {message}") def run(playwright: Playwright, browser_name: str) -> None: log_note(f"Launch browser {browser_name}") @@ -25,11 +21,8 @@ def run(playwright: Playwright, browser_name: str) -> None: try: log_note("Login") page.goto("http://nc/") - page.get_by_label("Login with username or email").click() - page.get_by_label("Login with username or email").fill("Crash") - page.get_by_label("Login with username or email").press("Tab") - page.get_by_label("Password", exact=True).fill("Override") - page.get_by_label("Password", exact=True).press("Enter") + login_nextcloud(page) + log_note("Create new text file") page.get_by_role("link", name="Files").click() page.get_by_role("link", name="New file/folder menu").click() @@ -37,9 +30,9 @@ def run(playwright: Playwright, browser_name: str) -> None: page.locator("#view7-input-file").fill("colab_meeting.md") page.locator("#view7-input-file").press("Enter") page.get_by_role("button", name="Create a new file with the selected template").click() - sleep(5) - with contextlib.suppress(TimeoutError): - page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000) + + close_modal(page) + page.keyboard.press("Escape") log_note("Share file with other user") page.get_by_role("link", name="colab_meeting .md").get_by_role("link", name="Share").click() diff --git a/energy-tests/nextcloud_create_event.py b/energy-tests/nextcloud_create_event.py index 52164ab5..2a909c5b 100644 --- a/energy-tests/nextcloud_create_event.py +++ b/energy-tests/nextcloud_create_event.py @@ -3,14 +3,10 @@ import sys from time import time_ns, sleep import signal -from playwright.sync_api import Playwright, sync_playwright, expect, TimeoutError +from playwright.sync_api import Playwright, sync_playwright, expect -def timeout_handler(signum, frame): - raise TimeoutError("Page.content() timed out") +from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler -def log_note(message: str) -> None: - timestamp = str(time_ns())[:16] - print(f"{timestamp} {message}") def run(playwright: Playwright, browser_name: str) -> None: log_note(f"Launch browser {browser_name}") @@ -26,24 +22,14 @@ def run(playwright: Playwright, browser_name: str) -> None: try: page.goto("http://nc/login") log_note("Login") - page.get_by_label("Login with username or email").fill("Crash") - page.get_by_label("Login with username or email").press("Tab") - page.get_by_label("Password", exact=True).fill("Override") - page.get_by_label("Password", exact=True).press("Enter") + login_nextcloud(page) + log_note("Wait for welcome popup") - # Sleep to make sure the modal has time to appear before continuing navigation - sleep(5) - log_note("Close welcome popup") - with contextlib.suppress(TimeoutError): - page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000) + close_modal(page) log_note("Go to calendar") page.get_by_role("link", name="Calendar").click() - # Second welcome screen? - with contextlib.suppress(TimeoutError): - page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000) - log_note("Create event") event_name = "Weekly sync" page.get_by_role("button", name="New event").click() diff --git a/energy-tests/nextcloud_create_user.py b/energy-tests/nextcloud_create_user.py index bb29a058..acc76726 100644 --- a/energy-tests/nextcloud_create_user.py +++ b/energy-tests/nextcloud_create_user.py @@ -3,14 +3,9 @@ import contextlib from time import time_ns, sleep import signal -from playwright.sync_api import Playwright, sync_playwright, TimeoutError +from playwright.sync_api import Playwright, sync_playwright -def timeout_handler(signum, frame): - raise TimeoutError("Page.content() timed out") - -def log_note(message: str) -> None: - timestamp = str(time_ns())[:16] - print(f"{timestamp} {message}") +from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler def create_user(playwright: Playwright, browser_name: str, username: str, password: str) -> None: log_note(f"Launch browser {browser_name}") @@ -24,19 +19,11 @@ def create_user(playwright: Playwright, browser_name: str, username: str, passwo try: page = context.new_page() log_note("Login") - page.goto("http://nc/") - page.get_by_label("Login with username or email").click() - page.get_by_label("Login with username or email").fill("Crash") - page.get_by_label("Login with username or email").press("Tab") - page.get_by_label("Password", exact=True).fill("Override") - page.get_by_label("Password", exact=True).press("Enter") + login_nextcloud(page) log_note("Wait for welcome popup") - # Sleep to make sure the modal has time to appear before continuing navigation - sleep(5) + close_modal(page) - with contextlib.suppress(TimeoutError): - page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000) log_note("Create user") page.get_by_role("link", name="Open settings menu").click() page.get_by_role("link", name="Users").first.click() diff --git a/energy-tests/nextcloud_docs_collaboration.py b/energy-tests/nextcloud_docs_collaboration.py index 7b28d358..cbd87dfd 100644 --- a/energy-tests/nextcloud_docs_collaboration.py +++ b/energy-tests/nextcloud_docs_collaboration.py @@ -1,20 +1,12 @@ import contextlib -import random import string import sys -from time import time_ns, sleep +from time import sleep -from playwright.sync_api import Playwright, sync_playwright, expect, TimeoutError +from playwright.sync_api import Playwright, sync_playwright, expect +from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler -def get_random_text() -> str: - size_in_bytes = 1024 - characters = string.ascii_letters + string.digits - return ''.join(random.choice(characters) for _ in range(size_in_bytes)) - -def log_note(message: str) -> None: - timestamp = str(time_ns())[:16] - print(f"{timestamp} {message}") def collaborate(playwright: Playwright, browser_name: str) -> None: log_note(f"Launch two {browser_name} browsers") @@ -25,7 +17,7 @@ def collaborate(playwright: Playwright, browser_name: str) -> None: # The mode is however ~40% slower: https://github.com/microsoft/playwright/issues/21216 browser = playwright.chromium.launch(headless=False,args=["--headless=new"]) context = browser.new_context() - admin_user = context.new_page() + admin_user_page = context.new_page() if browser_name == "firefox": @@ -35,29 +27,28 @@ def collaborate(playwright: Playwright, browser_name: str) -> None: # The mode is however ~40% slower: https://github.com/microsoft/playwright/issues/21216 browser_two = playwright.chromium.launch(headless=False,args=["--headless=new"]) context_two = browser_two.new_context() - docs_user = context_two.new_page() + docs_user_page = context_two.new_page() try: # Login and open the file for both users log_note("Logging in with users") - login(admin_user, "Crash", "Override") - login(docs_user, "docs_dude", "docsrule!12") + login_nextcloud(admin_user_page, "Crash", "Override") + login_nextcloud(docs_user_page, "docs_dude", "docsrule!12") log_note("Opening document with both users") - with contextlib.suppress(TimeoutError): - sleep(5) - docs_user.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000) - admin_user.get_by_role("link", name="Files", exact=True).click() - docs_user.get_by_role("link", name="Files", exact=True).click() - admin_user.get_by_role("link", name="Shares", exact=True).click() - docs_user.get_by_role("link", name="Shares", exact=True).click() - admin_user.get_by_role("link", name="colab_meeting .md").click() - docs_user.get_by_role("link", name="colab_meeting .md").click() + close_modal(docs_user_page) + + admin_user_page.get_by_role("link", name="Files", exact=True).click() + docs_user_page.get_by_role("link", name="Files", exact=True).click() + admin_user_page.get_by_role("link", name="Shares", exact=True).click() + docs_user_page.get_by_role("link", name="Shares", exact=True).click() + admin_user_page.get_by_role("link", name="colab_meeting .md").click() + docs_user_page.get_by_role("link", name="colab_meeting .md").click() # Write the first message and assert it's visible for the other user log_note("Sending first validation message") first_message = "FIRST_VALIDATION_MESSAGE" - admin_user.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(first_message) - expect(docs_user.get_by_text(first_message)).to_be_visible() + admin_user_page.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(first_message) + expect(docs_user_page.get_by_text(first_message)).to_be_visible() log_note("GMT_SCI_R=1") for x in range(1, 7): @@ -65,12 +56,12 @@ def collaborate(playwright: Playwright, browser_name: str) -> None: # Admin sends on even, docs_dude on odd if x % 2 == 0: log_note("Admin adding text") - admin_user.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(random_message) - expect(docs_user.get_by_text(random_message)).to_be_visible(timeout=15_000) + admin_user_page.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(random_message) + expect(docs_user_page.get_by_text(random_message)).to_be_visible(timeout=15_000) else: log_note("User adding text") - docs_user.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(random_message) - expect(admin_user.get_by_text(random_message)).to_be_visible(timeout=15_000) + docs_user_page.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(random_message) + expect(admin_user_page.get_by_text(random_message)).to_be_visible(timeout=15_000) log_note("GMT_SCI_R=1") log_note("Sleeping for 5 seconds") @@ -78,8 +69,8 @@ def collaborate(playwright: Playwright, browser_name: str) -> None: log_note("Closing browsers") # --------------------- - admin_user.close() - docs_user.close() + admin_user_page.close() + docs_user_page.close() context.close() context_two.close() browser.close() @@ -88,17 +79,10 @@ def collaborate(playwright: Playwright, browser_name: str) -> None: except Exception as e: if hasattr(e, 'message'): # only Playwright error class has this member log_note(f"Exception occurred: {e.message}") - log_note(f"Page content was: {docs_user.content()}") - log_note(f"Page content was: {admin_user.content()}") + log_note(f"Page content was: {docs_user_page.content()}") + log_note(f"Page content was: {admin_user_page.content()}") raise e -def login(page, username, password): - page.goto("http://nc/login") - page.get_by_label("Login with username or email").click() - page.get_by_label("Login with username or email").fill(username) - page.get_by_label("Login with username or email").press("Tab") - page.get_by_label("Password", exact=True).fill(password) - page.get_by_label("Password", exact=True).press("Enter") with sync_playwright() as playwright: diff --git a/energy-tests/nextcloud_install.py b/energy-tests/nextcloud_install.py index b9f79477..d8eece9e 100644 --- a/energy-tests/nextcloud_install.py +++ b/energy-tests/nextcloud_install.py @@ -1,14 +1,9 @@ import sys import signal from time import time_ns -from playwright.sync_api import sync_playwright, TimeoutError +from playwright.sync_api import sync_playwright -def timeout_handler(signum, frame): - raise TimeoutError("Page.content() timed out") - -def log_note(message: str) -> None: - timestamp = str(time_ns())[:16] - print(f"{timestamp} {message}") +from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler def main(browser_name: str = "chromium"): with sync_playwright() as playwright: @@ -25,23 +20,21 @@ def main(browser_name: str = "chromium"): page = context.new_page() signal.alarm(0) # remove timeout signal try: - page.set_default_timeout(240_000) # 240 seconds (timeout is in milliseconds) page.goto('http://nc/') # 1. Create User log_note("Create admin user") - page.type('#adminlogin', 'Crash') - page.type('#adminpass', 'Override') - page.click('.primary') + page.locator('#adminlogin').fill('Crash') + page.locator('#adminpass').fill('Override') + page.locator('.primary').click() # 2. Install all Apps log_note("Install recommended apps") install_selector = '.button-vue--vue-primary' - page.wait_for_selector(install_selector) - page.click(install_selector) + page.locator(install_selector).click() # 3. Dashboard - page.wait_for_selector('.app-dashboard') + page.locator('.app-dashboard', timeout=240_000) log_note("Installation complete") browser.close() @@ -50,13 +43,10 @@ def main(browser_name: str = "chromium"): log_note(f"Exception occurred: {e.message}") # set a timeout. Since the call to page.content() is blocking we need to defer it to the OS - try: - signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(20) - log_note(f"Page content was: {page.content()}") - signal.alarm(0) # remove timeout signal - except TimeoutError as exc: - raise e from exc + signal.signal(signal.SIGALRM, timeout_handler) + signal.alarm(20) + log_note(f"Page content was: {page.content()}") + signal.alarm(0) # remove timeout signal raise e diff --git a/energy-tests/nextcloud_talk.py b/energy-tests/nextcloud_talk.py index 91238e80..ce9e3d35 100644 --- a/energy-tests/nextcloud_talk.py +++ b/energy-tests/nextcloud_talk.py @@ -5,19 +5,9 @@ import sys import signal from time import sleep, time_ns -from playwright.sync_api import Playwright, sync_playwright, expect, TimeoutError +from playwright.sync_api import Playwright, sync_playwright, expect -def timeout_handler(signum, frame): - raise TimeoutError("Page.content() timed out") - -def log_note(message: str) -> None: - timestamp = str(time_ns())[:16] - print(f"{timestamp} {message}") - -def get_random_text() -> str: - size_in_bytes = 20 * 1024 - characters = string.ascii_letters + string.digits - return ''.join(random.choice(characters) for _ in range(size_in_bytes)) +from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler def send_message(sender, message): log_note("Sending message") @@ -38,35 +28,20 @@ def create_conversation(playwright: Playwright, browser_name: str) -> str: page = context.new_page() try: log_note("Login as admin") - page.goto("http://nc/") - page.get_by_label("Login with username or email").click() - page.get_by_label("Login with username or email").fill("Crash") - page.get_by_label("Login with username or email").press("Tab") - page.get_by_label("Password", exact=True).fill("Override") - page.get_by_role("button", name="Log in").click() + login_nextcloud(page) # Wait for the modal to load. As it seems you can't close it while it is showing the opening animation. log_note("Close first-time run popup") - with contextlib.suppress(TimeoutError): - sleep(5) - page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000) + close_modal(page) log_note("Open Talk app") page.locator('#header').get_by_role("link", name="Talk", exact=True).click() page.wait_for_url("**/apps/spreed/") - # Second welcome screen? - with contextlib.suppress(TimeoutError): - page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000) - # Headless browsers trigger a warning in Nextcloud, however they actually work fine log_note("Close headless warning") with contextlib.suppress(TimeoutError): - page.wait_for_selector('.toast-close') - page.click('.toast-close') - - page.wait_for_selector('.toast-close') - page.click('.toast-close') + page.locator('.toast-close').click() log_note("Create conversation") page.click("span.chat-plus-icon") @@ -94,7 +69,6 @@ def create_conversation(playwright: Playwright, browser_name: str) -> str: signal.alarm(20) log_note(f"Page content was: {page.content()}") signal.alarm(0) # remove timeout signal - raise e def talk(playwright: Playwright, url: str, browser_name: str) -> None: @@ -121,7 +95,7 @@ def talk(playwright: Playwright, url: str, browser_name: str) -> None: log_note("Close headless warning") with contextlib.suppress(TimeoutError): for page in pages: - page.wait_for_selector('.toast-close').click() + page.locator('.toast-close').click() # Perform actions for all users log_note("Set guest usernames")