From 4b4fd0735ba674a30c564d924864c48b50b7a4cf Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Thu, 28 Nov 2024 17:51:22 -0500 Subject: [PATCH] test: Make -t auto a bit more resilient by hoisting all the retries into one place that makes sense to me. --- tools/autotest.py | 409 ++++++++++++++++++++-------------------------- 1 file changed, 173 insertions(+), 236 deletions(-) diff --git a/tools/autotest.py b/tools/autotest.py index 5eb37f4d..b5a7a9df 100755 --- a/tools/autotest.py +++ b/tools/autotest.py @@ -9,14 +9,65 @@ 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 exists_in_shadow_root(shadow_root, by, value): - return lambda driver: shadow_root.find_element(by, value) +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: @@ -27,290 +78,176 @@ try: wait = WebDriverWait(driver, 10) driver.get('http://localhost:8888') - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.LINK_TEXT, 'login').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'register_label').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('adminuser') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('admin_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'confirm').send_keys('admin_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - driver.switch_to.frame(driver.find_element(By.ID, 'document')) - wait.until(expected_conditions.presence_of_element_located((By.LINK_TEXT, 'identity'))) - driver.switch_to.default_content() + 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/') - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - driver.switch_to.frame(driver.find_element(By.ID, 'document')) - wait.until(expected_conditions.presence_of_element_located((By.ID, 'gs_room_name'))).send_keys('test room') - wait.until(expected_conditions.presence_of_element_located((By.XPATH, '//*[@id="gs_room_name"]/following-sibling::button'))).click() + 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() - driver.switch_to.default_content() - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'identity').click() - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'logout').click() + 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') - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.LINK_TEXT, 'login').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'register_label').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('testuser') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'confirm').send_keys('test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() + 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')]) - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - - driver.switch_to.default_content() - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'create_identity').click() + select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'create_identity')], ('click',)) wait.until(expected_conditions.alert_is_present()).accept() - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) + 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',)) - driver.switch_to.default_content() - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'identity').click() - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'id_dropdown').find_element(By.XPATH, '//button[position()=2]').click() - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - driver.switch_to.frame(driver.find_element(By.ID, 'document')) - # NoSuchShadowRootException - while True: - try: - tf_app = wait.until(expected_conditions.presence_of_element_located((By.TAG_NAME, 'tf-app'))).shadow_root - break - except: - pass - wait.until(exists_in_shadow_root(wait.until(exists_in_shadow_root(tf_app, By.ID, 'tf-tab-news')).shadow_root, By.CLASS_NAME, 'tf-profile')).shadow_root.find_element(By.ID, 'edit_profile').click() - wait.until(exists_in_shadow_root(wait.until(exists_in_shadow_root(tf_app, By.ID, 'tf-tab-news')).shadow_root, By.CLASS_NAME, 'tf-profile')).shadow_root.find_element(By.ID, 'name').send_keys('user') - wait.until(exists_in_shadow_root(wait.until(exists_in_shadow_root(tf_app, By.ID, 'tf-tab-news')).shadow_root, By.CLASS_NAME, 'tf-profile')).shadow_root.find_element(By.ID, 'save_profile').click() - driver.switch_to.default_content() - wait.until(expected_conditions.presence_of_element_located((By.XPATH, '//button[text()="✅ Allow"]'))).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.switch_to.default_content() driver.get('http://localhost:8888/~testuser/test/') - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - while True: - try: - wait.until(exists_in_shadow_root(driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root, By.ID, 'close_error')).click() - break - except: - pass + 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',)) - driver.switch_to.default_content() - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.LINK_TEXT, 'edit').click() - editor = driver.find_element(By.ID, 'editor').find_element(By.CLASS_NAME, 'cm-content') - editor.click() - editor.send_keys('app.setDocument(\n\t"
Hello, world!
"\n);'); - driver.find_element(By.ID, 'save').click() - - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - driver.switch_to.frame(driver.find_element(By.ID, 'document')) - wait.until(expected_conditions.presence_of_element_located((By.ID, 'test-div'))) + 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']) - driver.switch_to.default_content() - editor = driver.find_element(By.ID, 'editor').find_element(By.CLASS_NAME, 'cm-content') - editor.click() - editor.clear() - editor.send_keys('app.setDocument("
Hello, world, again!
")'); - driver.find_element(By.ID, 'save').click() + 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')]) - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - driver.switch_to.frame(driver.find_element(By.ID, 'document')) - wait.until(expected_conditions.presence_of_element_located((By.ID, 'test-div2'))) - - driver.switch_to.default_content() - driver.find_element(By.ID, 'delete').click() + 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/') - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - while True: - try: - wait.until(exists_in_shadow_root(driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root, By.ID, 'close_error')).click() - break - except: - pass - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.LINK_TEXT, 'edit').click() + + 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') - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - driver.switch_to.frame(driver.find_element(By.ID, 'document')) - - wait.until(expected_conditions.presence_of_element_located((By.LINK_TEXT, 'identity'))) + 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']) - wait.until(expected_conditions.presence_of_element_located((By.LINK_TEXT, 'identity'))).click() + select(driver, [('id', 'document'), ('frame',), ('link_text', 'identity')], ('click',)) - # StaleElementReferenceException - while True: - try: - driver.switch_to.default_content() - wait.until(expected_conditions.presence_of_element_located((By.ID, 'content'))) - driver.switch_to.frame(wait.until(expected_conditions.presence_of_element_located((By.ID, 'document')))) - wait.until(expected_conditions.presence_of_element_located((By.ID, 'create_id'))).click() - driver.switch_to.alert.accept() - break - except: - pass + select(driver, [('id', 'document'), ('frame',), ('id', 'create_id')], ('click',)) + id0 = select(driver, [('id', 'document'), ('frame',), ('tag', 'li')]).text.split(' ')[-1] - # StaleElementReferenceException - while True: - try: - id0 = wait.until(expected_conditions.presence_of_element_located((By.TAG_NAME, 'li'))).text.split(' ')[-1] - break - except: - pass - wait.until(expected_conditions.presence_of_element_located((By.XPATH, '//li/button[text()="Export Identity"]'))).click() - driver.switch_to.default_content() - wait.until(expected_conditions.presence_of_element_located((By.XPATH, '//button[text()="✅ Allow"]'))).click() - driver.switch_to.frame(wait.until(expected_conditions.presence_of_element_located((By.ID, 'document')))) - words = wait.until(expected_conditions.presence_of_element_located((By.XPATH, '//li//textarea'))).get_attribute('value') - wait.until(expected_conditions.presence_of_element_located((By.XPATH, '//li/button[text()="Delete Identity"]'))).click() + 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() - driver.switch_to.default_content() - wait.until(expected_conditions.presence_of_element_located((By.XPATH, '//button[text()="✅ Allow"]'))).click() + 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')))) - words = wait.until(expected_conditions.presence_of_element_located((By.XPATH, '//textarea'))).send_keys(words) - wait.until(expected_conditions.presence_of_element_located((By.XPATH, '//button[text()="Import Identity"]'))).click() - driver.switch_to.default_content() - wait.until(expected_conditions.presence_of_element_located((By.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 = wait.until(expected_conditions.presence_of_element_located((By.TAG_NAME, 'li'))).text.split(' ')[-1] + id1 = select(driver, [('id', 'document'), ('frame',), ('tag', 'li')]).text.split(' ')[-1] + assert id0 == id1 driver.get('http://localhost:8888') - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - driver.switch_to.frame(driver.find_element(By.ID, 'document')) - wait.until(expected_conditions.presence_of_element_located((By.LINK_TEXT, 'ssb'))).click() - driver.switch_to.default_content() + 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',)) - wait.until(expected_conditions.presence_of_element_located((By.ID, 'content'))) + 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',)) - # StaleElementReferenceException - while True: - try: - driver.switch_to.frame(wait.until(expected_conditions.presence_of_element_located((By.ID, 'document')))) - break - except: - pass - # NoSuchShadowRootException - while True: - try: - tf_app = wait.until(expected_conditions.presence_of_element_located((By.TAG_NAME, 'tf-app'))).shadow_root - break - except: - pass + 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',)]) - # WebDriverException (shadow root is detached) - while True: - try: - tf_tab_news = wait.until(exists_in_shadow_root(tf_app, By.ID, 'tf-tab-news')).shadow_root - tf_tab_news.find_element(By.ID, 'tf-compose').shadow_root.find_element(By.ID, 'edit').send_keys('Hello, world!') - tf_tab_news.find_element(By.ID, 'tf-compose').shadow_root.find_element(By.ID, 'submit').click() - break - except: - pass + select(driver, [('tag', 'tf-navigation'), ('shadow_root',), ('id', 'logout')], ('click',)) + select(driver, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'login_label')], ('click',)) - driver.switch_to.default_content() - driver.find_element(By.ID, 'allow').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')]) - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'identity').click() - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'logout').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'login_label').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('testuser') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() + 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')]) - wait.until(expected_conditions.presence_of_element_located((By.ID, 'content'))) + 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')]) - while True: - try: - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'identity').click() - break - except: - pass - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'logout').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'guest_label').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'guestButton').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, [('tag', 'tf-auth'), ('shadow_root',), ('id', 'error')]) - wait.until(expected_conditions.presence_of_element_located((By.ID, 'content'))) - driver.switch_to.frame(wait.until(expected_conditions.presence_of_element_located((By.ID, 'document')))) - # NoSuchShadowRootException - while True: - try: - tf_app = wait.until(expected_conditions.presence_of_element_located((By.TAG_NAME, 'tf-app'))).shadow_root - break - except: - pass - driver.switch_to.default_content() + 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')]) - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'logout').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'login_label').click() + 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',)]) - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('testuser') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('wrong_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'error') - - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('wrong_user') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'error') - - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'register_label').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('testuser') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('wrong_test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'confirm').send_keys('wrong_test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'error') - - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'register_label').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('1invalid') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'confirm').send_keys('test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'error') - - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'register_label').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('😁') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'confirm').send_keys('test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'error') - - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'change_label').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('testuser') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'new_password').send_keys('new_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'confirm').send_keys('new_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) - while True: - try: - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'identity').click() - break - except: - pass - driver.find_element(By.TAG_NAME, 'tf-navigation').shadow_root.find_element(By.ID, 'logout').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'login_label').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('testuser') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('test_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'error') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'login_label').click() - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'name').send_keys('testuser') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'password').send_keys('new_password') - driver.find_element(By.TAG_NAME, 'tf-auth').shadow_root.find_element(By.ID, 'loginButton').click() - wait.until(expected_conditions.presence_of_element_located((By.ID, 'document'))) + 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: