2014-04-10 11 views
19

Da das Tor Browser Bundle nur eine Patch-Version von Firefox ist, sollte es möglich sein, einen FirefoxDriver mit Tor Browser zu verwenden. Dies ist, was ich bisher versucht:Verwenden von Selenium WebDriver mit Tor

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"); 

Dies führt zu einer leeren Tor-Browser-Seite Öffnung mit einer Popup-Nachricht: Ihr Firefox-Profil kann nicht geladen werden. Es kann fehlen oder nicht zugreifbar sein.

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

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

Ich weiß nicht, wie Befehle in einer solchen Weise geöffnet an einen Browser zu senden, jedoch.

Ich habe ähnliche Fragen gefunden, aber ich bin speziell auf der Suche nach einer Java-Lösung, vorzugsweise unter Windows getestet.

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

+0

Nach dem [Tor-Browser-Design Seite] (https://www.torproject.org/projects/torbrowser/design/), die Patches in die Firefox-Version kompiliert verhindern Erweiterungen von der Ausführung . Da das "Remote-Ende" des Firefox-Treibers als Browsererweiterung implementiert ist, könnte sich dies auf Ihre Fähigkeit auswirken, WebDriver zu verwenden, um den Tor-Browser zu steuern? – JimEvans

+0

Ich habe das auch, aber es scheint, dass es von Mimi unten erreicht wurde. Außerdem habe ich es unter Linux laufen. –

+0

Ein Unterschied zwischen Ihrem Code und dem unten angegebenen Code besteht darin, dass Sie "Start Tor Browser.exe" starten, während der andere Code die eingebettete Firefox-Programmdatei startet. Wenn ich Ihre 'FirefoxBinary' so ändere, dass sie auf' C: \ Benutzer \ \ Desktop \ Tor Browser \ Browser \ Firefox.exe 'zeigt, kann ich den Browser ohne Fehler starten, aber am meisten die WebDriver-Erweiterung belädt sicher nicht. – JimEvans

Antwort

17

Da das Tor-Browser-Bundle die WebDriver-Erweiterung nicht verwenden konnte, habe ich eine Problemumgehung gefunden, in der ich Tor von einem normalen Firefox-Browser aus ausgeführt habe. Solange der Tor-Browser geöffnet ist, können Sie Tor mit einem normalen Firefox-Browser verwenden.

  • öffnen Tor Browser:

    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(); 
    } 
    
  • Öffnen Sie 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); 
    
  • Schließen Browser. Beachten Sie, dass Sie, wenn Sie viel schließen und erneut öffnen möchten (nützlich beim Abrufen einer neuen IP-Adresse), die Profilpräferenz toolkit.startup.max_resumed_crashes auf einen hohen Wert wie 9999 setzen möchten.

    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; 
    } 
    
+1

Vielen Dank, das ist sehr hilfreich! –

+1

Ich habe versucht, diese Schritte zu folgen, aber ich bekomme Fehler während der Ausführung von TOR, wenn der Browser startet, ein Pop-up sagt, ** TOR konnte nicht starten ** wird angezeigt. –

+0

@JoseBernhardt Haben Sie bitte einen vollen Code? GitHub vielleicht? oder in einer privaten E-Mail? –

3

ich versuchen würde, den Weg eines der vorhandenen Profile spezifiziert und Ihr Profil Instanz initialisieren für Tor, damit Ihr Code etwas aussehen würde:

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 versuchte nicht, das da ich nicht habe WebDriver Setup zu Hause, aber dies sollte Ihnen erlauben, ein Profil anzugeben.

+1

Vielleicht möchten Sie sich die folgende Frage ansehen. http://stackoverflow.com/questions/15316304/open-tor-browser-with-selenium?rq=1 –

+0

Ich bekomme immer noch: * Ihr Firefox-Profil kann nicht geladen werden. Es kann fehlen oder nicht zugreifbar sein. * –

+0

Ich würde überprüfen, der Pfad zu dem Profil ist in der Tat gültig. –

2

Ich heruntergeladen TorBrowser und ich konnte es ohne Probleme nennen, mit dem folgenden Code (es ist Mac OS). Also ich denke, dass es kein Problem bezüglich der Kompatibilität zwischen dem Firefox-Treiber und der neuesten Version von Tor Browser geben sollte.

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 bereits den Pfad Ihres Profils mit binary.startProfile getestet, aber ich glaube, Sie erneut versuchen könnten Slash statt Backslash zu verwenden, um den Pfad angeben, Querprüft, ob die Datei existiert ->profile.default, und verwende absoluten Pfad anstelle von relativ ->../.

+0

Ich verwendete tatsächlich die vollständigen, absoluten Pfade in meiner Implementierung. Ich habe jetzt die absoluten Pfade gezeigt, um Verwirrung zu vermeiden. Wie für Backslashes, sie sind auf Windows-Computern verwendet, so ist das definitiv nicht das Problem. Eine Sache, die herausragt, ist, dass Sie das Standard-Firefox-Profil anstelle des Tor-Angebots verwendet haben. Ich habe das versucht, aber es hat auch nicht funktioniert. –

1

auch Dieser Code ziemlich gut in Ubuntu funktioniert. 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 

    } 
} 
0

Wenn Sie vor allem über die Fernsteuerung eines Browsers Pflege Tor mit (und würde vielleicht lieber das Tor Browser statt Vanille Firefox verwenden), können Sie Mozilla verwenden Marionette. Verwenden Sie wie

mit dem Tor-Browser nutzen zu können, aktivieren Sie mariniert beim Start über

Browser/firefox -marionette 

(innerhalb des Bündels). Dann können Sie über

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

verbinden und eine neue Seite zum Beispiel laden über

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

Weitere Beispiele gibt es eine tutorial zusammen mit mehr Dokumentation.

(copy)