Files
WebScraper/TROUBLESHOOTING_DE.md
2025-12-09 14:57:18 +01:00

10 KiB

ProtonVPN-Integration: Troubleshooting & FAQ

Inhaltsverzeichnis


Häufige Probleme

Problem 1: Extension wird nicht gefunden

Symptom: Failed to navigate to ProtonVPN extension popup

Ursache:

  • Extension nicht installiert
  • Falsche Extension-ID in Konfiguration
  • Chrome lädt Extension nicht automatisch

Lösung:

# 1. Extension ID überprüfen
# Chrome öffnen → chrome://extensions/ → ProtonVPN Details anklicken
# Extension ID kopieren und in .env eintragen

PROTONVPN_EXTENSION_ID=ghmbeldphafepmbegfdlkpapadhbakde  # Aktualisieren!

# 2. Manuell in Chrome installieren
# https://chrome.google.com/webstore/detail/protonvpn/ghmbeldphafepmbegfdlkpapadhbakde

Problem 2: "Disconnect button not found" oder "Connect button not found"

Symptom: Extension-Buttons werden nicht gefunden

Ursache:

  • Extension UI hat sich geändert (Update)
  • XPath-Selektoren sind veraltet
  • HTML-Struktur unterscheidet sich zwischen Browser-Versionen

Lösung:

// 1. Browser DevTools öffnen
// Chrome: F12 → Öffne chrome-extension://[ID]/popup.html

// 2. HTML inspizieren:
// Right-click auf Button → Inspect Element

// 3. XPath-Selektoren aktualisieren
// In src/scraper/protonvpn_extension.rs:
//
// Falls neuer HTML-Struktur, z.B.:
// <button class="vpn-connect-btn">Connect</button>
//
// Neuer XPath:
let xpath = "//button[@class='vpn-connect-btn']";

// Oder alternative Strategien hinzufügen zur find_and_click_button()-Funktion

Modifizierte find_and_click_button() für neue Selektoren:

async fn find_and_click_button(&self, client: &Client, text: &str) -> Result<()> {
    let lower_text = text.to_lowercase();
    
    let xpath_strategies = vec![
        // Text-basiert (case-insensitive)
        format!(
            "//button[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '{}')]",
            lower_text
        ),
        // CSS-Klassen (AnpassEN nach Bedarf)
        format!("//button[contains(@class, '{}')]", text),
        // Data-Attribute
        format!("//*[@data-action='{}']", lower_text),
        // Aria-Label
        format!("//*[@aria-label='{}']", text),
        // SVG + Text (für moderne UIs)
        format!("//*[contains(., '{}')][@role='button']", text),
    ];

    for xpath in xpath_strategies {
        if let Ok(element) = client.find(fantoccini::LocatorStrategy::XPath(&xpath)).await {
            element.click().await?;
            debug!("Clicked: {}", text);
            return Ok(());
        }
    }

    Err(anyhow!("Button '{}' not found", text))
}

Problem 3: VPN verbindet sich nicht oder Timeout

Symptom: Failed to connect to ProtonVPN server 'US' within 15 seconds

Ursachen:

  1. ProtonVPN-Server überlastet
  2. Netzwerk-Latenz
  3. Falsche Server-Name
  4. Browser-Erweiterung nicht vollständig geladen

Lösungen:

A. Timeout erhöhen:

// In protonvpn_extension.rs, connect_to_server():
// Erhöhe von 30 auf 60 Versuche
for attempt in 0..60 {  // 30s → 60 Versuche = 30s timeout
    sleep(Duration::from_millis(500)).await;
    if self.is_connected(client).await.unwrap_or(false) {
        return Ok(());
    }
}

B. Server-Namen überprüfen:

# Gültige ProtonVPN-Server (für Free-Tier):
# US, UK, JP, NL, etc.
# 
# Oder mit Nummern:
# US-Free#1, US-Free#2, UK-Free#1
# US#1, US#2 (für Plus-Tier)

# In .env überprüfen:
VPN_SERVERS=US,UK,JP,NL
# NICHT: VPN_SERVERS=US-Free#1, UK-Free#1  (zu viele Leerzeichen)

C. Extension-Status überprüfen:

// Debug: Printe HTML vor Connect-Versuch
let extension_url = format!("chrome-extension://{}/popup.html", self.extension_id);
client.goto(&extension_url).await?;
sleep(Duration::from_secs(1)).await;

let html = client.source().await?;
println!("=== EXTENSION HTML ===");
println!("{}", html);
println!("=====================");

Problem 4: IP-Adresse wird nicht extrahiert

Symptom: Failed to extract IP from whatismyipaddress.com

Ursache: HTML-Struktur hat sich geändert

Lösung:

// In protonvpn_extension.rs, get_current_ip():
// Füge Debug-Ausgabe hinzu:

let page_source = client.source().await?;
println!("=== PAGE SOURCE ===");
println!("{}", page_source);
println!("===================");

// Dann neue Regex/Extraction-Logik basierend auf aktuellem HTML

Alternative IP-Check-Services:

// icanhazip.com (gibt nur IP zurück)
client.goto("https://icanhazip.com/").await?;
sleep(Duration::from_secs(1)).await;
let ip = client.source().await?.trim().to_string();

// ifconfig.me
client.goto("https://ifconfig.me/").await?;
sleep(Duration::from_secs(1)).await;
let ip = client.source().await?.trim().to_string();

// checkip.amazonaws.com
client.goto("https://checkip.amazonaws.com/").await?;
sleep(Duration::from_secs(1)).await;
let ip = client.source().await?.trim().to_string();

Problem 5: Session-Manager erstellt Sessions, aber VPN verbindet nicht

Symptom: VPN session created, but is_connected() returns false

Ursache:

  • WebDriver-Client hat Extension nicht geladen
  • ChromeDriver-Instanz verwirrt zwischen mehreren Sessions

Lösung:

Sicherstellen, dass jeder WebDriver-Client die Extension hat:

// In webdriver.rs, ChromeInstance::new() oder new_with_extension():
// Extension-Pfad muss zu Chrome-Start mitgegeben werden

let mut cmd = Command::new("chromedriver-win64/chromedriver.exe");
cmd.arg("--port=0");

// Hinweis: Extension wird automatisch geladen, wenn in Chrome installiert
// Für Testing kann man auch Headless-Modus deaktivieren:
// cmd.arg("--headless=false");  // Damit man Browser sieht

Konfiguration Debug

Enable Debug Logging

# Terminal
RUST_LOG=debug cargo run

# Oder in code:
tracing_subscriber::fmt()
    .with_max_level(tracing::Level::DEBUG)  // Statt INFO
    .init();

Überprüfen Sie die geladene Konfiguration

# .env Datei überprüfen
cat .env

# Oder Ausgabe am Start ansehen
cargo run

# Output sollte zeigen:
# ✓ Config loaded | VPN: enabled | Max Parallel: 3

Test-Konfigurationen

Minimal (ohne VPN):

ENABLE_VPN_ROTATION=false
MAX_PARALLEL_TASKS=1

Mit VPN, aber langsam:

ENABLE_VPN_ROTATION=true
VPN_SERVERS=US,UK
TASKS_PER_VPN_SESSION=5
MAX_PARALLEL_TASKS=1  # Nur eine Instanz für Testing
RUST_LOG=debug

Mit VPN, normal:

ENABLE_VPN_ROTATION=true
VPN_SERVERS=US,UK,JP,NL,DE
TASKS_PER_VPN_SESSION=10
MAX_PARALLEL_TASKS=3

Extension-Selektoren aktualisieren

Wie man neue Selektoren findet

  1. Chrome öffnen:

    chrome://extensions/ → ProtonVPN → Details
    
  2. Popup öffnen:

    Navigate to: chrome-extension://[ID]/popup.html
    
  3. DevTools öffnen (F12):

    • Elements Tab
    • Inspect Element (Button rechts oben)
    • Klicke auf Button im Popup
  4. HTML kopieren:

    <!-- Beispiel neuer Button -->
    <button class="btn btn-primary" id="connect-btn">
        <i class="icon-vpn"></i>
        Connect
    </button>
    
  5. Neuen XPath erstellen:

    // Option 1: Nach ID
    "//button[@id='connect-btn']"
    
    // Option 2: Nach Klasse
    "//button[@class='btn btn-primary']"
    
    // Option 3: Nach Text
    "//button[contains(text(), 'Connect')]"
    
  6. In find_and_click_button() hinzufügen:

    let xpath_strategies = vec![
        "//button[@id='connect-btn']".to_string(),
        "//button[@class='btn btn-primary']".to_string(),
        // ... other strategies
    ];
    

Performance-Tipps

1. Batch-Processing statt paralleles Threading

// ❌ LANGSAM: Zu viele parallele Instances
let pool = ChromeDriverPool::new(10).await?;

// ✅ SCHNELLER: Weniger Instances, mehr Tasks pro Instance
let pool = ChromeDriverPool::new(3).await?;
config.max_tasks_per_instance = 20;  // Recycel nach 20 Tasks

2. VPN-Verbindung optimieren

// ❌ LANGSAM: Jeder Task rotiert IP
TASKS_PER_VPN_SESSION=1

// ✅ SCHNELLER: Mehrere Tasks pro IP
TASKS_PER_VPN_SESSION=10

3. Timing anpassen

// Zu aggressive:
sleep(Duration::from_millis(100)).await;

// Besser (für VPN):
sleep(Duration::from_millis(500)).await;

// Für Disconnect/Connect Sequenzen:
// Mindestens 2-3 Sekunden zwischen Operationen

4. Server-Auswahl

# ❌ Problematic: Zu viele ähnliche Server
VPN_SERVERS=US-Free#1,US-Free#2,US-Free#3,US-Free#4

# ✅ Better: Mix aus verschiedenen Ländern
VPN_SERVERS=US-Free#1,UK-Free#1,JP-Free#1,NL-Free#1

Testing ohne VPN

1. VPN deaktivieren für Testing

ENABLE_VPN_ROTATION=false
MAX_PARALLEL_TASKS=1
ECONOMIC_LOOKAHEAD_MONTHS=1  # Kleinere Datenmenge

2. Mock-Tests schreiben

#[tokio::test]
async fn test_vpn_session_manager() {
    let mgr = VpnSessionManager::new(
        vec!["US".to_string(), "UK".to_string()],
        3
    );
    
    mgr.create_new_session().await.unwrap();
    assert!(mgr.get_current_session().await.is_some());
}

3. Extension-Fehler isolieren

# Test nur extension.rs
cargo test --lib scraper::protonvpn_extension

4. Scraping ohne VPN testen

# Setze ENABLE_VPN_ROTATION=false
ENABLE_VPN_ROTATION=false RUST_LOG=info cargo run

Weitere Ressourcen


Support & Debugging-Checkliste

Bevor Sie ein Issue öffnen:

  • .env ist korrekt konfiguriert
  • ProtonVPN Extension ist installiert
  • Chrome + ChromeDriver sind kompatibel
  • RUST_LOG=debug wurde ausgeführt um Logs zu sehen
  • Selektoren wurden mit Browser DevTools überprüft
  • Test ohne VPN (ENABLE_VPN_ROTATION=false) funktioniert
  • Server-Namen sind korrekt (z.B. US, nicht USA)