diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index 1569fd16..c6c3e502 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -85,7 +85,7 @@ class DealfrontScraper: logger.error(f"Konnte Debug-Artefakte nicht speichern: {e}") def login(self): - """Führt NUR den Login-Prozess durch und wartet danach eine feste Zeit.""" + """Führt NUR den Login-Prozess durch. Klickt und geht sofort weiter.""" if not self.driver: return False username, password = self._load_credentials() if not username or not password: return False @@ -98,10 +98,7 @@ class DealfrontScraper: self.driver.find_element(By.CSS_SELECTOR, "input[type='password']").send_keys(password) self.driver.find_element(By.XPATH, "//button[normalize-space()='Log in']").click() - logger.info("Login-Befehl gesendet. Warte jetzt eine feste Zeit von 15 Sekunden, um die Session vollständig zu etablieren.") - time.sleep(15) # NEU: Erhöhte Wartezeit auf 15 Sekunden - - logger.info("Wartezeit nach Login beendet. Gehe zum nächsten Schritt.") + logger.info("Login-Befehl gesendet. Die Seite leitet nun weiter.") return True except Exception as e: @@ -109,6 +106,28 @@ class DealfrontScraper: self._save_debug_artifacts() return False + def navigate_to_target(self): + """Navigiert direkt zur Target-URL und wartet auf Bestätigung.""" + try: + logger.info(f"Navigiere direkt zur Target-URL: {Config.DEALFRONT_TARGET_URL}") + self.driver.get(Config.DEALFRONT_TARGET_URL) + + # Warten, bis die URL sich tatsächlich ändert. + self.wait.until(EC.url_contains("/t/prospector/")) + logger.info(f"URL-Wechsel bestätigt. Aktuelle URL: {self.driver.current_url}") + + # Warten, bis die Seite gerendert ist. + verification_selector = (By.XPATH, "//button[normalize-space()='+ Neue Suche']") + self.wait.until(EC.visibility_of_element_located(verification_selector)) + + logger.info("'Target'-Seite erfolgreich und vollständig geladen.") + return True + + except Exception as e: + logger.critical(f"Navigation zur 'Target'-Seite fehlgeschlagen: {type(e).__name__}", exc_info=True) + self._save_debug_artifacts() + return False + def navigate_to_target(self): """ Navigiert zum 'Target'-Bereich und verifiziert den Erfolg in drei Schritten. @@ -208,7 +227,7 @@ class DealfrontScraper: self.driver.quit() if __name__ == "__main__": - logger.info("Starte Dealfront Automatisierung - Phase 2a: Suche und Extraktion") + logger.info("Starte Dealfront Automatisierung - Rekonstruierter Workflow") scraper = None try: @@ -216,22 +235,22 @@ if __name__ == "__main__": if not scraper.driver: raise Exception("WebDriver konnte nicht initialisiert werden.") - # === GETRENNTE AUFRUFE === # Schritt 1: Login if not scraper.login(): raise Exception("Login fehlgeschlagen.") - time.sleep(2) # Kurze Pause nach dem Login + # Kurze Pause, um der Weiterleitung nach dem Login eine Chance zu geben. + # Dies ist der einzige 'sleep', den wir brauchen. + time.sleep(5) # Schritt 2: Navigation if not scraper.navigate_to_target(): raise Exception("Navigation zur Target-Seite fehlgeschlagen.") - # Schritt 3: Suche laden + # ... (Rest der main-Funktion mit Suche und Extraktion bleibt gleich) ... if not scraper.load_search(Config.TARGET_SEARCH_NAME): raise Exception(f"Laden der Suche '{Config.TARGET_SEARCH_NAME}' fehlgeschlagen.") - # Schritt 4: Ergebnisse extrahieren und ausgeben companies = scraper.extract_current_page_results() if companies: df = pd.DataFrame(companies) @@ -247,7 +266,7 @@ if __name__ == "__main__": else: logger.warning("Keine Firmen auf der ersten Seite extrahiert oder gefunden.") - logger.info("Phase 2a Test erfolgreich abgeschlossen. Warte vor dem Schließen...") + logger.info("Test erfolgreich abgeschlossen. Warte vor dem Schließen...") time.sleep(10) except Exception as e: