73 lines
3.0 KiB
Python
73 lines
3.0 KiB
Python
import asyncio
|
|
import os
|
|
import logging
|
|
from pyppeteer import launch
|
|
from pyppeteer.errors import TimeoutError
|
|
|
|
# Logging-Konfiguration
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
|
|
# --- Konfiguration ---
|
|
HA_URL = "http://192.168.178.131:8123/lovelace/solar?kiosk"
|
|
OUTPUT_FILE = "/screenshots/debug_screenshot_final.png"
|
|
|
|
# NEU: Anmeldedaten aus Umgebungsvariablen lesen
|
|
HA_USERNAME = os.environ.get("HA_USERNAME")
|
|
HA_PASSWORD = os.environ.get("HA_PASSWORD")
|
|
|
|
async def main():
|
|
if not HA_USERNAME or not HA_PASSWORD:
|
|
logging.error("Fehler: HA_USERNAME oder HA_PASSWORD Umgebungsvariable nicht gefunden!")
|
|
return
|
|
|
|
logging.info("Starte Puppeteer-Browser...")
|
|
browser = await launch(
|
|
executablePath='/usr/bin/chromium',
|
|
headless=True,
|
|
ignoreHTTPSErrors=True,
|
|
args=['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage']
|
|
)
|
|
|
|
page = await browser.newPage()
|
|
await page.setViewport({'width': 1280, 'height': 1024})
|
|
|
|
try:
|
|
logging.info(f"Navigiere zur initialen URL: {HA_URL}")
|
|
await page.goto(HA_URL, {'waitUntil': 'networkidle0', 'timeout': 60000})
|
|
await asyncio.sleep(3)
|
|
|
|
# Warten, bis das Login-Formular bereit ist
|
|
username_input_selector = 'input[name="username"]'
|
|
await page.waitForSelector(username_input_selector, {'timeout': 10000})
|
|
|
|
logging.info("Login-Formular erkannt. Fülle Anmeldedaten aus...")
|
|
await page.type(username_input_selector, HA_USERNAME)
|
|
await page.type('input[name="password"]', HA_PASSWORD)
|
|
|
|
# --- FINALE, ROBUSTE KLICK-METHODE VIA JAVASCRIPT ---
|
|
# Dieses Skript dringt in den Shadow DOM ein, um den Button zu finden und zu klicken.
|
|
logging.info("Klicke auf 'LOG IN'-Button via JavaScript (für Shadow DOM)...")
|
|
await page.evaluate('''() => {
|
|
document.querySelector('ha-auth-flow').shadowRoot.querySelector('ha-form > mwc-button').click();
|
|
}''')
|
|
|
|
logging.info("Warte nach Login auf Navigation/Neuladen...")
|
|
# Wir warten darauf, dass die Login-Maske verschwindet.
|
|
# Ein guter Indikator ist, wenn das 'ha-auth-flow'-Element nicht mehr da ist.
|
|
await page.waitForSelector('ha-auth-flow', {'hidden': True, 'timeout': 20000})
|
|
|
|
logging.info("Login erfolgreich, Seite wird neu geladen. Warte auf finale Ansicht...")
|
|
await asyncio.sleep(10) # Finale Wartezeit für das Dashboard-Rendering
|
|
|
|
logging.info("Erstelle finalen Screenshot...")
|
|
await page.screenshot({'path': OUTPUT_FILE})
|
|
logging.info(f"Screenshot erfolgreich unter {OUTPUT_FILE} gespeichert.")
|
|
|
|
except Exception as e:
|
|
logging.error(f"Ein Fehler ist aufgetreten: {e}", exc_info=True)
|
|
logging.info("Speichere Screenshot des Fehler-Zustands...")
|
|
await page.screenshot({'path': '/screenshots/debug_error_final.png'})
|
|
|
|
finally:
|
|
logging.info("Schließe Browser.")
|
|
await browser.close() |