Dieser Commit ist enthalten in:
Claude Project Manager
2026-01-18 18:15:34 +01:00
Ursprung 4e82d5ef8f
Commit a25a26a01a
47 geänderte Dateien mit 4756 neuen und 2956 gelöschten Zeilen

Datei anzeigen

@ -327,15 +327,140 @@ class FacebookUIHelper:
def check_element_exists(self, selector: str, timeout: int = 1000) -> bool:
"""
Prüft ob ein Element existiert.
Args:
selector: CSS-Selektor
timeout: Maximale Wartezeit in ms
Returns:
bool: True wenn Element existiert
"""
if not self._ensure_browser():
return False
return self.automation.browser.is_element_visible(selector, timeout=timeout)
return self.automation.browser.is_element_visible(selector, timeout=timeout)
# ==========================================================================
# ANTI-DETECTION: Tab-Navigation Methoden
# ==========================================================================
def navigate_to_next_field(self, use_tab: bool = None) -> bool:
"""
Navigiert zum nächsten Feld, entweder per Tab oder Maus-Klick.
Diese Methode simuliert menschliches Verhalten durch zufällige
Verwendung von Tab-Navigation (wie viele echte Benutzer es tun).
Args:
use_tab: Explizit Tab verwenden. Wenn None, 50% Chance für Tab.
Returns:
bool: True bei Erfolg
"""
if not self._ensure_browser():
return False
# Entscheide zufällig ob Tab verwendet wird (50% Chance)
if use_tab is None:
use_tab = random.random() < 0.5
try:
if use_tab:
logger.debug("Verwende Tab-Navigation zum nächsten Feld")
self.automation.browser.page.keyboard.press("Tab")
# Variable Wartezeit nach Tab
time.sleep(random.uniform(0.15, 0.35))
# Gelegentlich Tab + Shift-Tab (versehentlich zu weit gegangen)
if random.random() < 0.08:
logger.debug("Simuliere Tab-Korrektur (zu weit)")
self.automation.browser.page.keyboard.press("Tab")
time.sleep(random.uniform(0.2, 0.4))
self.automation.browser.page.keyboard.press("Shift+Tab")
time.sleep(random.uniform(0.15, 0.3))
return True
else:
logger.debug("Tab-Navigation nicht verwendet (Maus wird später genutzt)")
return False
except Exception as e:
logger.error(f"Fehler bei Tab-Navigation: {e}")
return False
def fill_field_with_tab_navigation(self, selector: str, value: str,
use_tab_navigation: bool = None,
error_rate: float = 0.15) -> bool:
"""
Füllt ein Feld aus mit optionaler Tab-Navigation.
Diese Methode kombiniert Tab-Navigation mit menschenähnlichem Tippen
für ein realistischeres Verhalten.
Args:
selector: CSS-Selektor des Feldes
value: Einzugebender Wert
use_tab_navigation: Ob Tab verwendet werden soll (None = 50% Chance)
error_rate: Wahrscheinlichkeit für Tippfehler (10-20%)
Returns:
bool: True bei Erfolg
"""
if not self._ensure_browser():
return False
try:
# Entscheide Navigationsmethode
if use_tab_navigation is None:
use_tab_navigation = random.random() < 0.5
if use_tab_navigation:
# Tab-Navigation verwenden
logger.debug(f"Fülle Feld {selector} mit Tab-Navigation")
self.automation.browser.page.keyboard.press("Tab")
time.sleep(random.uniform(0.15, 0.35))
else:
# Maus-Klick auf Feld
logger.debug(f"Fülle Feld {selector} mit Maus-Klick")
if not self.automation.browser.click_element(selector):
logger.warning(f"Konnte Feld nicht anklicken: {selector}")
return False
time.sleep(random.uniform(0.2, 0.5))
# Anti-Detection Delay vor Eingabe
if hasattr(self.automation, 'human_behavior'):
self.automation.human_behavior.anti_detection_delay("field_focus")
# Text mit Tippfehlern eingeben
for i, char in enumerate(value):
# Tippfehler simulieren
if random.random() < error_rate:
# Falsches Zeichen
wrong_char = random.choice('abcdefghijklmnopqrstuvwxyz0123456789')
self.automation.browser.page.keyboard.type(wrong_char)
time.sleep(random.uniform(0.1, 0.3))
# Korrektur mit Backspace
self.automation.browser.page.keyboard.press("Backspace")
time.sleep(random.uniform(0.08, 0.2))
# Korrektes Zeichen
self.automation.browser.page.keyboard.type(char)
# Variable Verzögerung
delay_ms = random.randint(50, 150)
if char in ' .,!?':
delay_ms *= random.uniform(1.3, 2.0)
time.sleep(delay_ms / 1000)
# Gelegentlich längere Pause (Denken)
if random.random() < 0.05:
time.sleep(random.uniform(0.3, 0.8))
logger.info(f"Feld {selector} erfolgreich ausgefüllt")
return True
except Exception as e:
logger.error(f"Fehler beim Ausfüllen mit Tab-Navigation: {e}")
return False