#!/usr/bin/env python3 """ Minimal Selenium Test - Auto-save Countdown Ultra-simpel version der prøver at undgå Chrome profile konflikter """ import time import sys import os from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options # Load credentials from .env LOGIN_USERNAME = "toemrer" LOGIN_PASSWORD = "REDACTED_AUTH" def test_countdown(): """Minimal test uden fancy setup""" driver = None try: print("🔧 Starter Chrome...") # Absolut minimal options options = Options() options.add_argument('--headless=new') options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') # Prøv at starte Chrome driver = webdriver.Chrome(options=options) print("✅ Chrome startet!") # Test 1: Load siden print("\n📍 Test 1: Loading http://localhost:4031...") driver.get("http://localhost:4031") time.sleep(3) print(f" ✅ Side loaded: {driver.title}") # Test 2: Find login eller homepage elementer print("\n📍 Test 2: Finder elementer...") try: # Prøv at finde navigation nav_elements = driver.find_elements(By.CLASS_NAME, "nav-btn") if nav_elements: print(f" ✅ Fandt {len(nav_elements)} navigation knapper") # Prøv at finde login login_fields = driver.find_elements(By.ID, "username") if login_fields: print(" ℹ️ Login påkrævet") print(f" 🔑 Bruger credentials fra .env: {LOGIN_USERNAME}") driver.find_element(By.ID, "username").send_keys(LOGIN_USERNAME) driver.find_element(By.ID, "password").send_keys(LOGIN_PASSWORD) driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click() time.sleep(3) print(" ✅ Login gennemført") # Naviger til projekt flow print("\n📍 Test 2b: Navigerer til Projekt Flow...") nav_buttons = driver.find_elements(By.CLASS_NAME, "nav-btn") for btn in nav_buttons: if "Projekt Flow" in btn.text: btn.click() time.sleep(2) print(" ✅ Navigeret til Projekt Flow") break # Opret et simpelt projekt først print("\n📍 Test 2c: Opretter test projekt...") try: # Udfyld projekt navn project_name = driver.find_element(By.ID, "projectName") project_name.clear() project_name.send_keys("Selenium Test Projekt") # Udfyld kunde navn customer_name = driver.find_element(By.ID, "customerName") customer_name.clear() customer_name.send_keys("Test Kunde") time.sleep(1) # Klik gem/næste knap save_buttons = driver.find_elements(By.XPATH, "//button[contains(text(), 'Næste') or contains(text(), 'Gem') or contains(text(), 'Opret')]") if save_buttons: save_buttons[0].click() time.sleep(3) print(" ✅ Projekt oprettet") else: print(" ⚠️ Kunne ikke finde gem knap") except Exception as e: print(f" ⚠️ Projekt oprettelse: {e}") # Klik på Geometri step print("\n📍 Test 2d: Åbner Geometri sektion...") try: # Find geometri step - det er typisk step #2 steps = driver.find_elements(By.CLASS_NAME, "step") print(f" 📊 Fandt {len(steps)} steps") if len(steps) >= 2: geometry_step = steps[1] # Index 1 = anden step (Geometri) step_name = geometry_step.text print(f" 🎯 Klikker på step: {step_name[:50]}...") # Klik på step geometry_step.click() time.sleep(3) print(" ✅ Geometri step klikket, venter på loading...") # Vent på at geometri form loader time.sleep(2) else: print(f" ⚠️ Kunne kun finde {len(steps)} steps") except Exception as e: print(f" ⚠️ Kunne ikke åbne geometri: {e}") except Exception as e: print(f" ⚠️ Element søgning: {e}") # Test 3: Søg efter countdown text print("\n📍 Test 3: Søger efter countdown...") try: # Vent lidt for at lade siden loade time.sleep(3) # Scroll ned for at se geometri inputs driver.execute_script("window.scrollTo(0, 500);") time.sleep(1) # Find alle input felter all_inputs = driver.find_elements(By.TAG_NAME, "input") number_inputs = driver.find_elements(By.CSS_SELECTOR, "input[type='number']") print(f" 📊 Fandt {len(all_inputs)} input felter totalt ({len(number_inputs)} numeriske)") # Find labels for at identificere felter labels = driver.find_elements(By.TAG_NAME, "label") print(f" 🏷️ Fandt {len(labels)} labels") page_text = driver.find_element(By.TAG_NAME, "body").text if "Gemmes automatisk" in page_text or "sekund" in page_text: print(" ✅ Countdown tekst fundet på siden!") # Find specifik countdown countdown_elements = driver.find_elements(By.XPATH, "//*[contains(text(), 'Gemmes automatisk')]") if countdown_elements: print(f" ✅ Countdown element: {countdown_elements[0].text}") # Prøv at observere countdown i aktion print("\n📍 Test 3b: Trigger countdown...") # Find input felter inputs = driver.find_elements(By.CSS_SELECTOR, "input[type='number']") if inputs: print(f" ✅ Fandt {len(inputs)} numeriske input felter") # Udfyld første felt inputs[0].clear() inputs[0].send_keys("10") time.sleep(0.5) # Observér countdown print(" ⏱️ Observerer countdown i 4 sekunder...") for i in range(4): try: countdown_el = driver.find_element(By.XPATH, "//*[contains(text(), 'Gemmes automatisk')]") print(f" [{i+1}s] Countdown: {countdown_el.text}") time.sleep(1) except: print(f" [{i+1}s] Countdown element ikke fundet") break else: print(" ⚠️ Countdown tekst ikke synlig på denne side") # Debug: Søg efter specifikke elementer print("\n 🔍 Debug - søger efter geometry-relaterede elementer:") geometry_classes = driver.find_elements(By.CSS_SELECTOR, "[class*='geometry'], [class*='Geometry'], [class*='enhanced']") print(f" - Geometry elementer: {len(geometry_classes)}") form_groups = driver.find_elements(By.CLASS_NAME, "form-group") print(f" - Form groups: {len(form_groups)}") # Hvis der er input felter, prøv at udfylde et if number_inputs and len(number_inputs) >= 2: print(f"\n 🧪 Udfylder bredde og længde felter...") # Scroll til første input driver.execute_script("arguments[0].scrollIntoView(true);", number_inputs[0]) time.sleep(0.5) # Udfyld bredde (første felt) number_inputs[0].click() number_inputs[0].clear() number_inputs[0].send_keys("10") print(" ✅ Bredde sat til 10m") time.sleep(0.5) # Udfyld længde (andet felt) number_inputs[1].click() number_inputs[1].clear() number_inputs[1].send_keys("15") print(" ✅ Længde sat til 15m") time.sleep(0.5) # Nu skal countdown være synlig - søg igen print("\n ⏱️ Søger efter countdown efter input...") for attempt in range(6): page_text = driver.find_element(By.TAG_NAME, "body").text if "Gemmes automatisk" in page_text and "sekund" in page_text: print(f" ✅ [Forsøg {attempt+1}] Countdown med sekunder fundet!") # Prøv flere selectors countdown_el = None try: # Prøv span først countdown_el = driver.find_element(By.XPATH, "//span[contains(text(), 'Gemmes automatisk')]") except: try: # Prøv div countdown_el = driver.find_element(By.XPATH, "//div[contains(text(), 'Gemmes automatisk')]") except: # Prøv enhver element countdown_el = driver.find_element(By.XPATH, "//*[contains(text(), 'Gemmes automatisk')]") if countdown_el: initial_text = countdown_el.text print(f" ✅ Initial countdown: {initial_text}") # Observér countdown over tid print("\n 📊 Observerer countdown progression...") for i in range(5): time.sleep(1) try: countdown_el = driver.find_element(By.XPATH, "//span[contains(text(), 'Gemmes automatisk')]") current_text = countdown_el.text print(f" [{i+1}s] {current_text}") except: print(f" [{i+1}s] Countdown forsvundet (data gemt)") break else: print(" ⚠️ Kunne ikke finde countdown element") break elif "Gemmes automatisk" in page_text: print(f" ℹ️ [Forsøg {attempt+1}] 'Gemmes automatisk' fundet, men ikke med sekunder") if attempt < 5: time.sleep(0.5) else: if attempt < 5: print(f" ⏳ [Forsøg {attempt+1}] Venter på countdown...") time.sleep(0.5) else: print(" ⚠️ Countdown stadig ikke synlig efter 6 forsøg") elif number_inputs: print(f" ⚠️ Kun {len(number_inputs)} numeriske felter fundet, behøver mindst 2") except Exception as e: print(f" ⚠️ Countdown søgning: {e}") import traceback traceback.print_exc() # Test 4: Take screenshot print("\n📍 Test 4: Tager screenshot...") try: screenshot_path = "/mnt/HC_Volume_103713257/tilbudgivern/selenium_screenshot.png" driver.save_screenshot(screenshot_path) print(f" ✅ Screenshot gemt: {screenshot_path}") # Gem også HTML for debugging html_path = "/mnt/HC_Volume_103713257/tilbudgivern/selenium_page.html" with open(html_path, 'w', encoding='utf-8') as f: f.write(driver.page_source) print(f" ✅ HTML gemt: {html_path}") except Exception as e: print(f" ⚠️ Screenshot/HTML: {e}") print("\n✅ Test gennemført!") return True except Exception as e: print(f"\n❌ Test fejlede: {e}") import traceback traceback.print_exc() return False finally: if driver: driver.quit() print("🔒 Chrome lukket") if __name__ == "__main__": success = test_countdown() sys.exit(0 if success else 1)