From 42359f48ba74425764700fcf10bef62a7943b4d7 Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 3 Jul 2025 06:31:39 +0000 Subject: [PATCH] bugfix --- dealfront_enrichment.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index a69923f2..e7dfde7f 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -73,7 +73,8 @@ class DealfrontScraper: def login(self): """ Führt den Login-Prozess auf der Dealfront-Plattform durch. - Diese Version wartet explizit auf jedes Element, bevor interagiert wird. + Diese Version wartet explizit auf jedes Element, bevor interagiert wird, + und verwendet die verifizierten Selektoren. """ if not self.driver: return False @@ -87,8 +88,7 @@ class DealfrontScraper: self.driver.get(DEALFRONT_LOGIN_URL) # --- 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. + # Wir verwenden 'name' als Selektor, da dieser im HTML verifiziert 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)) @@ -96,17 +96,17 @@ class DealfrontScraper: logger.info("E-Mail-Feld gefunden und ausgefüllt.") # --- SCHRITT 2: Passwort-Feld finden und ausfüllen --- - # Wir nehmen an, dass das Passwortfeld ebenfalls 'name="password"' hat. + # Wir verwenden 'name="password"', was der Standard ist. 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 = self.driver.find_element(*password_selector) password_field.send_keys(password) logger.info("Passwort-Feld gefunden und ausgefüllt.") # --- 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}") + logger.debug(f"Warte darauf, dass der Anmelde-Button klickbar ist: {login_button_selector}") login_button = self.wait.until(EC.element_to_be_clickable(login_button_selector)) login_button.click() logger.info("Anmelde-Button geklickt. Warte auf die Verifizierung...") @@ -114,18 +114,14 @@ class DealfrontScraper: # --- 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}") + logger.debug(f"Warte auf das Verifizierungs-Element: {verification_element_selector}") self.wait.until(EC.visibility_of_element_located(verification_element_selector)) - logger.info("Login erfolgreich! Dashboard-Element gefunden.") + 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 unerwarteter Fehler ist während des Logins aufgetreten: {type(e).__name__}", exc_info=True) + logger.critical(f"Ein Fehler ist während des Logins aufgetreten: {type(e).__name__}", exc_info=True) self._save_error_screenshot() return False