""" Gmail Login - Handhabt den Login-Prozess """ import logging import time import random from typing import Dict from playwright.sync_api import Page from social_networks.gmail import gmail_selectors as selectors from social_networks.gmail.gmail_ui_helper import GmailUIHelper logger = logging.getLogger("gmail_login") class GmailLogin: """ Handhabt den Gmail/Google Account Login-Prozess """ def __init__(self, page: Page, ui_helper: GmailUIHelper, screenshots_dir: str = None, save_screenshots: bool = True): """ Initialisiert den Login Handler """ self.page = page self.ui_helper = ui_helper self.screenshots_dir = screenshots_dir self.save_screenshots = save_screenshots def login(self, username: str, password: str) -> Dict[str, any]: """ Führt den Login durch """ try: logger.info(f"Starte Gmail Login für {username}") # Navigiere zur Login-Seite self.page.goto(selectors.LOGIN_URL, wait_until="domcontentloaded") time.sleep(random.uniform(2, 3)) self.ui_helper.take_screenshot("login_page") # Email eingeben if self.ui_helper.wait_for_element(selectors.LOGIN_EMAIL_INPUT, timeout=10000): logger.info("Gebe Email-Adresse ein") # Füge @gmail.com hinzu falls nicht vorhanden email = username if "@" in username else f"{username}@gmail.com" self.ui_helper.type_with_delay(selectors.LOGIN_EMAIL_INPUT, email) time.sleep(random.uniform(0.5, 1)) # Screenshot vor dem Weiter-Klick self.ui_helper.take_screenshot("email_entered") # Weiter klicken logger.info("Klicke auf Weiter") self.ui_helper.click_with_retry(selectors.LOGIN_NEXT_BUTTON) self.ui_helper.wait_for_loading_to_finish() time.sleep(random.uniform(2, 3)) # Passwort eingeben if self.ui_helper.wait_for_element(selectors.LOGIN_PASSWORD_INPUT, timeout=10000): logger.info("Gebe Passwort ein") self.ui_helper.type_with_delay(selectors.LOGIN_PASSWORD_INPUT, password) time.sleep(random.uniform(0.5, 1)) # Screenshot vor dem Login self.ui_helper.take_screenshot("password_entered") # Login Button klicken logger.info("Klicke auf Weiter") self.ui_helper.click_with_retry(selectors.LOGIN_NEXT_BUTTON) # Warte auf Navigation self.ui_helper.wait_for_navigation() time.sleep(random.uniform(3, 5)) # Prüfe ob Login erfolgreich war if self._check_login_success(): logger.info("Login erfolgreich") self.ui_helper.take_screenshot("login_success") return { "success": True, "message": "Login erfolgreich" } else: error_msg = self._get_error_message() logger.error(f"Login fehlgeschlagen: {error_msg}") self.ui_helper.take_screenshot("login_failed") return { "success": False, "error": error_msg, "message": f"Login fehlgeschlagen: {error_msg}" } except Exception as e: logger.error(f"Fehler beim Login: {e}") self.ui_helper.take_screenshot("login_error") return { "success": False, "error": str(e), "message": f"Login fehlgeschlagen: {str(e)}" } def _check_login_success(self) -> bool: """ Prüft ob der Login erfolgreich war """ try: # Prüfe ob wir auf einer Google-Seite sind current_url = self.page.url success_indicators = [ "myaccount.google.com", "mail.google.com", "youtube.com", "google.com/webhp", "accounts.google.com/b/" ] for indicator in success_indicators: if indicator in current_url: return True # Prüfe ob Login-Formular noch sichtbar ist if self.ui_helper.is_element_visible(selectors.LOGIN_EMAIL_INPUT): return False # Prüfe auf Fehlermeldung if self.ui_helper.is_element_visible(selectors.ERROR_MESSAGE): return False return True except Exception as e: logger.warning(f"Fehler bei der Login-Prüfung: {e}") return False def _get_error_message(self) -> str: """ Holt die Fehlermeldung falls vorhanden """ try: # Prüfe verschiedene Fehlermeldungs-Selektoren error_selectors = [ selectors.ERROR_MESSAGE, selectors.ERROR_MESSAGE_ALT, selectors.FORM_ERROR ] for selector in error_selectors: if self.ui_helper.is_element_visible(selector): error_text = self.ui_helper.get_element_text(selector) if error_text: return error_text return "Login fehlgeschlagen" except: return "Unbekannter Fehler"