This commit is contained in:
2025-07-03 05:16:40 +00:00
parent a36e943b07
commit 7d7b6874dc

View File

@@ -71,6 +71,10 @@ class DealfrontScraper:
logger.error(f"Konnte Screenshot nicht speichern: {e_ss}")
def login(self):
"""
Führt den Login-Prozess auf der Dealfront-Plattform durch.
Diese Version wartet explizit auf jedes Element, bevor interagiert wird.
"""
if not self.driver:
return False
@@ -81,43 +85,47 @@ class DealfrontScraper:
try:
logger.info(f"Navigiere zur Login-Seite: {DEALFRONT_LOGIN_URL}")
self.driver.get(DEALFRONT_LOGIN_URL)
# Warten, bis die Seite grundsätzlich geladen ist (z.B. auf das Username-Feld warten)
self.wait.until(EC.visibility_of_element_located((By.ID, "username")))
# Cookie-Banner behandeln, wenn es existiert
try:
# Wir suchen nach einem allgemeineren Cookie-Banner-Container
cookie_banner = self.driver.find_element(By.ID, "CybotCookiebotDialog")
if cookie_banner.is_displayed():
logger.debug("Cookie-Banner-Container gefunden. Suche nach 'Alle zulassen'-Button.")
# Suchen des Buttons innerhalb des Banners
allow_button = cookie_banner.find_element(By.ID, "CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll")
allow_button.click()
logger.info("Cookie-Banner akzeptiert.")
time.sleep(1) # Kurze Pause
except NoSuchElementException:
logger.warning("Kein Cookie-Banner gefunden. Fahre mit Login fort.")
# --- SCHRITT 1: Warten auf das E-Mail-Feld und ausfüllen ---
# Wir verwenden 'name' als Selektor, da dieser im HTML klar definiert ist.
# WebDriverWait stellt sicher, dass wir warten, bis das Element nicht nur da, sondern auch sichtbar ist.
email_selector = (By.NAME, "email")
logger.debug(f"Warte auf die Sichtbarkeit des E-Mail-Feldes mit Selektor: {email_selector}")
email_field = self.wait.until(EC.visibility_of_element_located(email_selector))
email_field.send_keys(username)
logger.info("E-Mail-Feld gefunden und ausgefüllt.")
username_field = self.driver.find_element(By.ID, "username")
password_field = self.driver.find_element(By.ID, "password")
username_field.send_keys(username)
# --- SCHRITT 2: Passwort-Feld finden und ausfüllen ---
# Wir nehmen an, dass das Passwortfeld ebenfalls 'name="password"' hat.
password_selector = (By.NAME, "password")
logger.debug(f"Suche Passwort-Feld mit Selektor: {password_selector}")
password_field = self.driver.find_element(*password_selector) # * entpackt das Tupel
password_field.send_keys(password)
logger.info("Benutzername und Passwort eingetragen.")
logger.info("Passwort-Feld gefunden und ausgefüllt.")
login_button = self.driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
# --- SCHRITT 3: Warten auf den Anmelde-Button und klicken ---
# Wir suchen nach einem Button, der den Text 'Anmelden' enthält. Das ist sehr robust.
login_button_selector = (By.XPATH, "//button[normalize-space()='Anmelden']")
logger.debug(f"Warte darauf, dass der Anmelde-Button klickbar ist mit Selektor: {login_button_selector}")
login_button = self.wait.until(EC.element_to_be_clickable(login_button_selector))
login_button.click()
logger.info("Login-Button geklickt. Warte auf die Verifizierung...")
logger.info("Anmelde-Button geklickt. Warte auf die Verifizierung...")
verification_element_xpath = "//input[@data-cy='header-search-input']"
self.wait.until(EC.visibility_of_element_located((By.XPATH, verification_element_xpath)))
# --- SCHRITT 4: Login-Erfolg verifizieren ---
# Wir warten auf das Suchfeld im Dashboard.
verification_element_selector = (By.XPATH, "//input[@data-cy='header-search-input']")
logger.debug(f"Warte auf das Verifizierungs-Element mit Selektor: {verification_element_selector}")
self.wait.until(EC.visibility_of_element_located(verification_element_selector))
logger.info("Login erfolgreich! Dashboard-Element gefunden.")
return True
except TimeoutException as e:
logger.critical(f"Login fehlgeschlagen - Timeout beim Warten auf ein Element.", exc_info=True)
self._save_error_screenshot()
return False
except Exception as e:
logger.critical(f"Ein Fehler ist während des Logins aufgetreten: {type(e).__name__}", exc_info=True)
logger.critical(f"Ein unerwarteter Fehler ist während des Logins aufgetreten: {type(e).__name__}", exc_info=True)
self._save_error_screenshot()
return False