web-dev-qa-db-fra.com

Utilisation de Selenium WebDriver avec Tor

Tor Browser Bundle n'étant qu'une version corrigée de Firefox, il semble qu'il devrait être possible d'utiliser FirefoxDriver avec Tor Browser. C'est ce que j'ai essayé jusqu'à présent:

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

Il en résulte une page vierge du navigateur Tor qui s'ouvre avec un message contextuel: Votre profil Firefox ne peut pas être chargé. Il peut être manquant ou inaccessible.

Je sais que le profil est valide/compatible car je peux démarrer avec succès le navigateur et le profil avec:

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

Cependant, je ne sais pas comment envoyer des commandes à un navigateur ouvert de cette manière.

J'ai trouvé des questions similaires, mais je recherche spécifiquement une solution Java, de préférence testée sous Windows.

J'utilise une bibliothèque Selenium autonome pouvant être téléchargée ici et l'ensemble de navigateurs Tor pouvant être téléchargé ici .

22
Joel Christophel

Parce que Tor Browser Bundle ne me permettait pas d'utiliser l'extension WebDriver, j'ai trouvé une solution de contournement dans laquelle j'ai exécuté Tor à partir d'un navigateur Firefox classique. Avec cette méthode, tant que le navigateur Tor est ouvert, vous pouvez utiliser Tor avec un navigateur Firefox classique.

  • Ouvrez le navigateur Tor :

    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();
    }
    
  • Ouvrez Firefox avec certaines configurations:

    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);
    
  • Fermer les navigateurs . Notez que si vous prévoyez de nombreuses fermetures et réouvertures (utiles pour obtenir une nouvelle adresse IP), il est conseillé de définir la préférence de profil toolkit.startup.max_resumed_crashes sur une valeur élevée telle que 9999.

    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
Joel Christophel

J'essaierais de spécifier le chemin d'accès à l'un des profils existants et d'initialiser votre instance de profil pour Tor afin que votre code ressemble à quelque chose comme: 

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

Je n'ai pas essayé cela car je n'ai pas de configuration WebDriver chez moi, mais cela devrait vous permettre de spécifier un profil. 

3
Dan Snell

J'ai téléchargé TorBrowser et j'ai pu l'appeler sans aucun problème, avec le code suivant (c'est Mac OS) . Donc, je pense qu'il ne devrait y avoir aucun problème de compatibilité entre le navigateur Web firefox et la dernière version de Tor Browser. .

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

Je sais que vous avez déjà testé le chemin de votre profil avec binary.startProfile, mais je pense que vous pourriez essayer à nouveau d'utiliser une barre oblique au lieu d'une barre oblique inverse pour spécifier le chemin, vérifiez si ce fichier existe -> profile.default et utilisez un chemin absolu au lieu de relatif - > ../.

2
user591593

Ce code fonctionne également assez bien dans ubuntu . Voici un exemple (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

    }
}

Si vous souhaitez surtout contrôler à distance un navigateur à l'aide de Tor (et préféreriez peut-être utiliser le navigateur Tor au lieu de Vanilla Firefox), vous pouvez utiliser Marionette de Mozilla. Utiliser comme 

Pour utiliser le navigateur Tor, activez marionette au démarrage via

Browser/firefox -marionette

(à l'intérieur du paquet). Ensuite, vous pouvez vous connecter via

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

et charger une nouvelle page par exemple via

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

Pour plus d'exemples, il y a un tutorial avec plus de documentation.

( copie )

0
serv-inc