#!/usr/bin/env python3 import os import subprocess import sys import time if sys.platform == 'haiku1': print('Automation tests are disabled on Haiku.') exit(0) import selenium from selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions from selenium.webdriver.support.ui import WebDriverWait def select(driver, path, action = None): start_time = time.time() while True: try: driver.switch_to.default_content() context = driver for node in path: if node[0] == 'tag': context = context.find_element(By.TAG_NAME, node[1]) elif node[0] == 'id': context = context.find_element(By.ID, node[1]) elif node[0] == 'xpath': context = context.find_element(By.XPATH, node[1]) elif node[0] == 'link_text': context = context.find_element(By.LINK_TEXT, node[1]) elif node[0] == 'class_name': context = context.find_element(By.CLASS_NAME, node[1]) elif node[0] == 'shadow_root': context = context.shadow_root elif node[0] == 'frame': driver.switch_to.frame(context) context = driver else: raise RuntimeError(f'Unexpected path node: {node}.') if action is not None: if action[0] == 'click': context.click() elif action[0] == 'send_keys': context.send_keys(action[1]) elif action[0] == 'clear': context.clear() else: raise RuntimeError(f'Unexpected action: {action}.') break else: return context except selenium.common.exceptions.NoSuchElementException: if time.time() - start_time < 5.0: time.sleep(0.1) pass except selenium.common.exceptions.NoSuchShadowRootException: if time.time() - start_time < 5.0: time.sleep(0.1) pass except selenium.common.exceptions.StaleElementReferenceException: if time.time() - start_time < 5.0: time.sleep(0.1) pass except selenium.common.exceptions.WebDriverException: if time.time() - start_time < 5.0: time.sleep(0.1) pass success = False try: options = webdriver.FirefoxOptions() service = Service(log_output = 'out/geckodriver.log') #options.add_argument('--headless') driver = webdriver.Firefox(options = options, service = service) wait = WebDriverWait(driver, 10) driver.get('http://localhost:8888') select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('link_text', 'login')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'register_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', 'adminuser')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'admin_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'confirm')], ('send_keys', 'admin_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('id', 'document'), ('frame',), ('link_text', 'identity')]) driver.get('http://localhost:8888/~core/admin/') select(driver, [('id', 'document'), ('frame',), ('id', 'gs_room_name')], ('send_keys', 'test room')) select(driver, [('id', 'document'), ('frame',), ('xpath', '//*[@id="gs_room_name"]/following-sibling::button')], ('click',)) driver.switch_to.alert.accept() select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'identity')], ('click',)) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'logout')], ('click',)) driver.get('http://localhost:8888') select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('link_text', 'login')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'register_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', 'testuser')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'confirm')], ('send_keys', 'test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('id', 'document')]) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'create_identity')], ('click',)) wait.until(expected_conditions.alert_is_present()).accept() select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'identity')], ('click',)) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'id_dropdown'), ('xpath', '//button[position()=2]')], ('click',)) select(driver, [('id', 'document'), ('frame',), ('tag', 'tf-app'), ('shadow_root',), ('id', 'tf-tab-news'), ('shadow_root',), ('class_name', 'tf-profile'), ('shadow_root',), ('id', 'edit_profile')], ('click',)) select(driver, [('id', 'document'), ('frame',), ('tag', 'tf-app'), ('shadow_root',), ('id', 'tf-tab-news'), ('shadow_root',), ('class_name', 'tf-profile'), ('shadow_root',), ('id', 'name')], ('send_keys', 'user')) select(driver, [('id', 'document'), ('frame',), ('tag', 'tf-app'), ('shadow_root',), ('id', 'tf-tab-news'), ('shadow_root',), ('class_name', 'tf-profile'), ('shadow_root',), ('id', 'save_profile')], ('click',)) select(driver, [('xpath', '//button[text()="✅ Allow"]')], ('click',)) driver.get('http://localhost:8888/~testuser/test/') select(driver, [('id', 'document')]) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'close_error')], ('click',)) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('link_text', 'edit')], ('click',)) select(driver, [('id', 'editor'), ('class_name', 'cm-content')], ('click',)) select(driver, [('id', 'editor'), ('class_name', 'cm-content')], ('send_keys', 'app.setDocument(\n\t"
Hello, world!
"\n);')) select(driver, [('id', 'save')], ('click',)) select(driver, [('id', 'document'), ('frame',), ('id', 'test-div')]) size = driver.get_window_size() driver.set_window_size(1200, 540) driver.save_screenshot('out/screenshot0.png') driver.set_window_size(size['width'], size['height']) select(driver, [('id', 'editor'), ('class_name', 'cm-content')], ('click',)) select(driver, [('id', 'editor'), ('class_name', 'cm-content')], ('clear',)) select(driver, [('id', 'editor'), ('class_name', 'cm-content')], ('send_keys', 'app.setDocument("
Hello, world, again!
")')) select(driver, [('id', 'save')], ('click',)) select(driver, [('id', 'document'), ('frame',), ('id', 'test-div2')]) select(driver, [('id', 'delete')], ('click',)) wait.until(expected_conditions.alert_is_present()).accept() wait.until(expected_conditions.alert_is_present()).dismiss() driver.get('http://localhost:8888/~testuser/test/') select(driver, [('id', 'document')]) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'close_error')], ('click',)) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('link_text', 'edit')], ('click',)) driver.get('http://localhost:8888') select(driver, [('id', 'document'), ('frame',), ('link_text', 'identity')]) size = driver.get_window_size() driver.set_window_size(540, 1200) driver.save_screenshot('out/screenshot1.png') driver.set_window_size(size['width'], size['height']) select(driver, [('id', 'document'), ('frame',), ('link_text', 'identity')], ('click',)) select(driver, [('id', 'document'), ('frame',), ('id', 'create_id')], ('click',)) id0 = select(driver, [('id', 'document'), ('frame',), ('tag', 'li')]).text.split(' ')[-1] select(driver, [('id', 'document'), ('frame',), ('xpath', '//li/button[text()="Export Identity"]')], ('click',)) select(driver, [('xpath', '//button[text()="✅ Allow"]')], ('click',)) words = select(driver, [('id', 'document'), ('frame',), ('xpath', '//li//textarea')]).get_attribute('value') select(driver, [('id', 'document'), ('frame',), ('xpath', '//li/button[text()="Delete Identity"]')], ('click',)) driver.switch_to.alert.send_keys('DELETE') driver.switch_to.alert.accept() select(driver, [('xpath', '//button[text()="✅ Allow"]')], ('click',)) driver.switch_to.alert.accept() words = select(driver, [('id', 'document'), ('frame',), ('xpath', '//textarea')], ('send_keys', words)) select(driver, [('id', 'document'), ('frame',), ('xpath', '//button[text()="Import Identity"]')], ('click',)) select(driver, [('xpath', '//button[text()="✅ Allow"]')], ('click',)) driver.switch_to.alert.accept() driver.switch_to.frame(wait.until(expected_conditions.presence_of_element_located((By.ID, 'document')))) id1 = select(driver, [('id', 'document'), ('frame',), ('tag', 'li')]).text.split(' ')[-1] assert id0 == id1 driver.get('http://localhost:8888') select(driver, [('id', 'document'), ('frame',), ('link_text', 'ssb')], ('click',)) select(driver, [('id', 'document'), ('frame',), ('tag', 'tf-app'), ('shadow_root',), ('id', 'tf-tab-news'), ('shadow_root',), ('id', 'tf-compose'), ('shadow_root',), ('id', 'edit')], ('send_keys', 'Hello, world!')) select(driver, [('id', 'document'), ('frame',), ('tag', 'tf-app'), ('shadow_root',), ('id', 'tf-tab-news'), ('shadow_root',), ('id', 'tf-compose'), ('shadow_root',), ('id', 'submit')], ('click',)) select(driver, [('xpath', '//button[text()="✅ Allow"]')], ('click',)) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'identity')], ('click',)) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'logout')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'login_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', 'testuser')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'identity')], ('click',)) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'logout')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'guest_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'guestButton')], ('click',)) select(driver, [('id', 'document'), ('frame',), ('tag', 'tf-app'), ('shadow_root',)]) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'logout')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'login_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', 'testuser')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'wrong_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'error')]) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', 'wrong_user')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'error')]) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'register_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', 'testuser')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'wrong_test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'confirm')], ('send_keys', 'wrong_test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'error')]) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'register_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', 'testuser')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'confirm')], ('send_keys', 'test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'error')]) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'register_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', '😁')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'confirm')], ('send_keys', 'test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'error')]) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'change_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', 'testuser')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'new_password')], ('send_keys', 'new_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'confirm')], ('send_keys', 'new_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('id', 'document'), ('frame',)]) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'identity')], ('click',)) select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'logout')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'login_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', 'testuser')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'test_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'error')]) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'login_label')], ('click',)) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'name')], ('send_keys', 'testuser')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'password')], ('send_keys', 'new_password')) select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'loginButton')], ('click',)) select(driver, [('id', 'document'), ('frame',)]) success = True finally: driver.close() driver.quit() if success: print('\033[92mTEST SUCCEEDED.\033[0m') else: print('\033[91mTEST FAILED.\033[0m')