From 7d7b6874dc454a193b037eb5b56f7be9c89912e8 Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 3 Jul 2025 05:16:40 +0000 Subject: [PATCH] bugfix --- dealfront_enrichment.py | 60 +++++++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index 95c1a650..a69923f2 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -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