163 lines
6.5 KiB
Python
163 lines
6.5 KiB
Python
"""
|
|
Diagnostic script to identify exact locator and page load issues
|
|
"""
|
|
import sys
|
|
from pathlib import Path
|
|
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
|
|
from selenium import webdriver
|
|
from selenium.webdriver.chrome.service import Service
|
|
from selenium.webdriver.chrome.options import Options
|
|
from selenium.webdriver.common.by import By
|
|
from webdriver_manager.chrome import ChromeDriverManager
|
|
from pages.login_page import LoginPage
|
|
from pages.mandatory_reset_page import MandatoryResetPage
|
|
from pages.profile_incomplete_page import ProfileIncompletePage
|
|
from config.config import TEST_USERNAME, TEST_PASSWORD, TEST_NEW_PASSWORD
|
|
import time
|
|
|
|
options = Options()
|
|
options.add_argument('--headless')
|
|
options.add_argument('--no-sandbox')
|
|
options.add_argument('--disable-dev-shm-usage')
|
|
|
|
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
|
|
|
|
try:
|
|
print("=" * 80)
|
|
print("DIAGNOSING LOGOUT ISSUE")
|
|
print("=" * 80)
|
|
|
|
# Login
|
|
login_page = LoginPage(driver)
|
|
login_page.login(TEST_USERNAME, TEST_PASSWORD)
|
|
|
|
# Handle password reset
|
|
reset_page = MandatoryResetPage(driver)
|
|
if reset_page.is_modal_present():
|
|
reset_page.reset_password(TEST_PASSWORD, TEST_NEW_PASSWORD, TEST_NEW_PASSWORD, TEST_USERNAME)
|
|
|
|
# Handle profile incomplete
|
|
profile_incomplete = ProfileIncompletePage(driver)
|
|
if profile_incomplete.is_modal_present():
|
|
profile_incomplete.click_complete()
|
|
time.sleep(2)
|
|
|
|
print(f"\nCurrent URL: {driver.current_url}")
|
|
|
|
# Check for profile button
|
|
print("\n--- PROFILE BUTTON LOCATORS ---")
|
|
locators = [
|
|
("Relative div button", "//nav//div[contains(@class, 'relative')]//button"),
|
|
("Button with span", "//nav//button[.//span]"),
|
|
("Button with SVG", "//nav//button[.//*[local-name()='svg']]"),
|
|
("All nav buttons", "//nav//button"),
|
|
]
|
|
|
|
for name, xpath in locators:
|
|
try:
|
|
elements = driver.find_elements(By.XPATH, xpath)
|
|
print(f"{name}: Found {len(elements)} elements")
|
|
for i, el in enumerate(elements[:3]):
|
|
try:
|
|
text = el.text[:50] if el.text else "No text"
|
|
print(f" Element {i+1}: text='{text}', displayed={el.is_displayed()}, enabled={el.is_enabled()}")
|
|
except:
|
|
print(f" Element {i+1}: (stale or error)")
|
|
except Exception as e:
|
|
print(f"{name}: Error - {e}")
|
|
|
|
# Try clicking profile button
|
|
print("\n--- ATTEMPTING PROFILE BUTTON CLICK ---")
|
|
try:
|
|
profile_btn = driver.find_element(By.XPATH, "//nav//div[contains(@class, 'relative')]//button")
|
|
if profile_btn.is_displayed():
|
|
print("Profile button found and visible")
|
|
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", profile_btn)
|
|
time.sleep(0.5)
|
|
profile_btn.click()
|
|
print("Profile button clicked")
|
|
time.sleep(2) # Wait for dropdown
|
|
|
|
# Check for sign out button
|
|
print("\n--- SIGN OUT BUTTON LOCATORS ---")
|
|
signout_locators = [
|
|
("Sign Out (capital)", "//button[contains(text(), 'Sign Out')]"),
|
|
("Sign out (lowercase)", "//button[contains(text(), 'Sign out')]"),
|
|
("Sign out (case insensitive)", "//button[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'sign out')]"),
|
|
("All buttons with text", "//button[text()]"),
|
|
]
|
|
|
|
for name, xpath in signout_locators:
|
|
try:
|
|
elements = driver.find_elements(By.XPATH, xpath)
|
|
print(f"{name}: Found {len(elements)} elements")
|
|
for i, el in enumerate(elements[:5]):
|
|
try:
|
|
text = el.text[:50] if el.text else "No text"
|
|
print(f" Element {i+1}: text='{text}', displayed={el.is_displayed()}")
|
|
except:
|
|
print(f" Element {i+1}: (stale or error)")
|
|
except Exception as e:
|
|
print(f"{name}: Error - {e}")
|
|
else:
|
|
print("Profile button not displayed")
|
|
except Exception as e:
|
|
print(f"Error clicking profile button: {e}")
|
|
|
|
print("\n" + "=" * 80)
|
|
print("DIAGNOSING PROFILE EDITOR ISSUE")
|
|
print("=" * 80)
|
|
|
|
# Navigate to profile editor if not already there
|
|
if "/profile-builder" not in driver.current_url:
|
|
driver.get("http://localhost:3983/student/profile-builder")
|
|
time.sleep(3)
|
|
|
|
print(f"\nCurrent URL: {driver.current_url}")
|
|
|
|
# Check for profile editor elements
|
|
print("\n--- PROFILE EDITOR ELEMENTS ---")
|
|
elements_to_check = [
|
|
("PAGE", "[data-testid='profile_editor__page']"),
|
|
("PROGRESS_VALUE", "[data-testid='profile_editor__progress_value']"),
|
|
("TAB_PERSONAL_INFORMATION", "[data-testid='profile_editor__tab_personal_information']"),
|
|
("Any data-testid with profile_editor", "[data-testid^='profile_editor__']"),
|
|
("Any tabs", "[role='tab']"),
|
|
("Any buttons", "button"),
|
|
]
|
|
|
|
for name, selector in elements_to_check:
|
|
try:
|
|
if selector.startswith("["):
|
|
elements = driver.find_elements(By.CSS_SELECTOR, selector)
|
|
else:
|
|
elements = driver.find_elements(By.XPATH, selector)
|
|
print(f"{name}: Found {len(elements)} elements")
|
|
if elements:
|
|
for i, el in enumerate(elements[:3]):
|
|
try:
|
|
text = el.text[:50] if el.text else "No text"
|
|
testid = el.get_attribute("data-testid") or "No testid"
|
|
print(f" Element {i+1}: text='{text}', data-testid='{testid}', displayed={el.is_displayed()}")
|
|
except:
|
|
print(f" Element {i+1}: (stale or error)")
|
|
except Exception as e:
|
|
print(f"{name}: Error - {e}")
|
|
|
|
# Check page source for profile editor indicators
|
|
print("\n--- PAGE SOURCE CHECK ---")
|
|
page_source = driver.page_source.lower()
|
|
indicators = ["profile", "editor", "builder", "personal information", "tab"]
|
|
for indicator in indicators:
|
|
count = page_source.count(indicator)
|
|
print(f"'{indicator}' appears {count} times in page source")
|
|
|
|
except Exception as e:
|
|
print(f"\nERROR: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
finally:
|
|
driver.quit()
|
|
|