it-swarm.com.de

Verwenden von Selenium WebDriver mit Tor

Da das Tor Browser Bundle nur eine gepatchte Version von Firefox ist, sollte es möglich sein, eine FirefoxDriver mit dem Tor Browser zu verwenden. Das habe ich bisher ausprobiert:

String torPath = "C:\\Users\\My User\\Desktop\\Tor Browser\\Start Tor Browser.exe";
String profilePath = "C:\\Users\\My User\\Desktop\\Tor Browser\\Data\\Browser\\profile.default";
FirefoxProfile profile = new FirefoxProfile(new File(profilePath));
FirefoxBinary binary = new FirefoxBinary(new File(torPath));
FirefoxDriver driver = new FirefoxDriver(binary, profile);
driver.get("http://www.google.com");

Daraufhin wird eine leere Tor Browser-Seite mit einer Popup-Meldung geöffnet: Ihr Firefox-Profil kann nicht geladen werden. Es kann fehlen oder nicht erreichbar sein.

Ich weiß, dass das Profil gültig/kompatibel ist, da ich den Browser und das Profil erfolgreich starten kann mit:

binary.startProfile(profile, profilePath, ""));

Ich kann jedoch nicht Befehle an einen Browser senden, der auf diese Weise geöffnet wurde.

Ich habe ähnliche Fragen gefunden, suche aber speziell nach einer Java-Lösung, die vorzugsweise unter Windows getestet wird.

Ich verwende eine eigenständige Selenium-Bibliothek, die hier heruntergeladen werden kann, und das Tor-Browser-Paket, das hier heruntergeladen werden kann.

22

Da das Tor Browser Bundle mir nicht erlaubte, die WebDriver-Erweiterung zu verwenden, fand ich eine Problemumgehung, bei der ich Tor von einem normalen Firefox-Browser aus ausführte. Solange der Tor-Browser geöffnet ist, können Sie Tor mit einem normalen Firefox-Browser verwenden.

  • Torbrowser öffnen :

    File torProfileDir = new File(
            "...\\Tor Browser\\Data\\Browser\\profile.default");
    FirefoxBinary binary = new FirefoxBinary(new File(
            "...\\Tor Browser\\Start Tor Browser.exe"));
    FirefoxProfile torProfile = new FirefoxProfile(torProfileDir);
    torProfile.setPreference("webdriver.load.strategy", "unstable");
    
    try {
        binary.startProfile(torProfile, torProfileDir, "");
    } catch (IOException e) {
        e.printStackTrace();
    }
    
  • Öffne Firefox mit einigen Konfigurationen:

    FirefoxProfile profile = new FirefoxProfile();
    profile.setPreference("network.proxy.type", 1);
    profile.setPreference("network.proxy.socks", "127.0.0.1");
    profile.setPreference("network.proxy.socks_port", 9150);
    FirefoxDriver = new FirefoxDriver(profile);
    
  • Browser schließen . Wenn Sie vorhaben, viel zu schließen und erneut zu öffnen (um eine neue IP-Adresse zu erhalten), empfiehlt es sich, die Profileinstellung toolkit.startup.max_resumed_crashes auf einen hohen Wert wie 9999 zu setzen.

    private void killFirefox() {
        Runtime rt = Runtime.getRuntime();
    
        try {
            rt.exec("taskkill /F /IM firefox.exe");
            while (processIsRunning("firefox.exe")) {
                Thread.sleep(100);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private boolean processIsRunning(String process) {
        boolean processIsRunning = false;
        String line;
        try {
            Process proc = Runtime.getRuntime().exec("wmic.exe");
            BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            OutputStreamWriter oStream = new OutputStreamWriter(proc.getOutputStream());
            oStream.write("process where name='" + process + "'");
            oStream.flush();
            oStream.close();
            while ((line = input.readLine()) != null) {
                if (line.toLowerCase().contains("caption")) {
                    processIsRunning = true;
                    break;
                }
            }
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return processIsRunning;
    }
    
18

Ich würde versuchen, den Pfad eines der vorhandenen Profile anzugeben und Ihre Profilinstanz für Tor zu initialisieren, damit Ihr Code etwa so aussieht: 

String torPath = "..\\Tor Browser\\Browser\\firefox.exe";
String profilePath = "..\\Tor Browser\\Data\Browser\\profile.default";
FirefoxProfile profile = new FirefoxProfile(new File(profilePath));
FirefoxBinary binary = new FirefoxBinary(new File(torPath));
FirefoxDriver driver = new FirefoxDriver(binary, profile);
driver.get("http://www.google.com");

Ich habe dies nicht versucht, da ich kein WebDriver-Setup zu Hause habe. Dies sollte jedoch die Angabe eines Profils ermöglichen. 

3
Dan Snell

Ich habe TorBrowser heruntergeladen und konnte es ohne Probleme mit dem folgenden Code (es ist Mac OS) anrufen .. __ Ich denke, es sollte kein Problem hinsichtlich der Kompatibilität zwischen dem Firefox-Webtreiber und der neuesten Version von Tor Browser geben .

String torPath = "/Volumes/DATA/Downloads/Tor.app/Contents/MacOS/TorBrowser.app/Contents/MacOS/firefox";
String profilePath = "/Users/mimitantono/Library/Application Support/Firefox/Profiles/1vps9kas.default-1384778906995";
FirefoxProfile profile = new FirefoxProfile(new File(profilePath));
FirefoxBinary binary = new FirefoxBinary(new File(torPath));
FirefoxDriver driver = new FirefoxDriver(binary, profile);
driver.get("http://www.google.com/webhp?complete=1&hl=en");

Ich weiß, dass Sie den Pfad Ihres Profils bereits mit binary.startProfile getestet haben, aber ich denke, Sie könnten erneut versuchen, den Schrägstrich anstelle des umgekehrten Schrägstrichs zu verwenden, um den Pfad anzugeben, eine Kreuzprüfung durchzuführen, ob diese Datei vorhanden ist -> profile.default, und einen absoluten Pfad anstelle von relativem > ../.

2
user591593

Dieser Code funktioniert auch gut in Ubuntu ..__ Hier ist ein Beispiel (JUnit4):

package qa2all;

import Java.io.File;
import Java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.Selenium.WebDriver;
import org.openqa.Selenium.firefox.FirefoxBinary;
import org.openqa.Selenium.firefox.FirefoxDriver;
import org.openqa.Selenium.firefox.FirefoxProfile;


public class HTMLUnit {
    private WebDriver driver;
    private String baseUrl;
    private StringBuffer verificationErrors = new StringBuffer();

    @Before
    public void setUp() throws Exception {
        //driver = new HtmlUnitDriver();    
        //driver = new FirefoxDriver();
        String torPath = "/home/user/Dropbox/Data/TorBrowser/Linux/32/start-tor-browser";
        String profilePath = "/home/user/Dropbox/Data/TorBrowser/Linux/32/TorBrowser/Data/Browser/profile.default/";
        FirefoxProfile profile = new FirefoxProfile(new File(profilePath));
        FirefoxBinary binary = new FirefoxBinary(new File(torPath));
        driver = new FirefoxDriver(binary, profile);        
        baseUrl = "https://qa2all.wordpress.com";
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Test
    public void testUntitled() throws Exception {
        driver.get(baseUrl + "/");

    }

    @After
    public void tearDown() throws Exception {
        driver.quit();
        String verificationErrorString = verificationErrors.toString();
        if (!"".equals(verificationErrorString)) {
            fail(verificationErrorString);
        }
    }

    private void fail(String verificationErrorString) {
        // TODO Auto-generated method stub

    }
}

Wenn Sie einen Browser hauptsächlich über Tor fernsteuern möchten (und den Tor-Browser lieber als Vanilla Firefox verwenden möchten), können Sie Mozillas Marionette verwenden. Verwenden Sie wie 

Um den Tor Browser zu verwenden, aktivieren Sie die Marionette beim Start mit

Browser/firefox -marionette

(innerhalb des Bündels). Dann können Sie sich per verbinden

from marionette import Marionette
client = Marionette('localhost', port=2828);
client.start_session()

und laden Sie beispielsweise eine neue Seite über

url='http://mozilla.org'
client.navigate(url);

Für weitere Beispiele gibt es ein tutorial mit mehr Dokumentation.

( Kopieren )

0
serv-inc