Update changes
Dieser Commit ist enthalten in:
@ -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
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren