java - Usando Selenium WebDriver con Tor
firefox selenium-webdriver (5)
Como Tor Browser Bundle no me permitía usar la extensión WebDriver, encontré una solución en la que ejecuté Tor desde un navegador Firefox normal. Con este método, siempre que el navegador Tor esté abierto, puedes usar Tor con un navegador Firefox normal.
Abrir el navegador 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(); }
Abre Firefox con algunas configuraciones:
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);
Cerrar los navegadores . Tenga en cuenta que si planea hacer mucho cierre y reapertura (útil para obtener una nueva dirección IP), le aconsejo que establezca la preferencia de perfil
toolkit.startup.max_resumed_crashes
a un valor alto como9999
.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; }
Debido a que Tor Browser Bundle es solo una versión parcheada de Firefox, parece que debería ser posible usar un FirefoxDriver
con Tor Browser. Esto es lo que he intentado hasta ahora:
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");
Esto hace que se abra una página en blanco del Navegador Tor con un mensaje emergente: No se puede cargar su perfil de Firefox. Puede faltar o ser inaccesible.
Sé que el perfil es válido / compatible porque puedo iniciar con éxito el navegador y el perfil con:
binary.startProfile(profile, profilePath, ""));
Sin embargo, no sé cómo enviar comandos a un navegador abierto de esa manera.
He encontrado preguntas similares, pero estoy buscando específicamente una solución Java, preferiblemente probada en Windows.
Estoy usando una biblioteca de Selenium independiente que se puede descargar here y el paquete del navegador Tor que se puede descargar here .
Descargué TorBrowser y pude llamarlo sin ningún problema, con el siguiente código (es Mac OS). Así que creo que no debería haber ningún problema sobre la compatibilidad entre el controlador web de Firefox y la última versión 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");
Sé que ya probó la ruta de su perfil con binary.startProfile
pero creo que podría intentar nuevamente usar barra diagonal en lugar de barra diagonal inversa para especificar la ruta, verificar si ese archivo existe -> profile.default
, y usar la ruta absoluta en lugar de pariente -> ../
.
Este código también está funcionando bastante bien en Ubuntu. Aquí hay un ejemplo (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
}
}
Intentaría especificar la ruta de acceso de uno de los perfiles existentes e inicializaría su instancia de perfil para Tor para que su código se pareciera a algo como:
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");
No intenté esto porque no tengo la configuración de WebDriver en casa, pero esto debería permitirte especificar un perfil.
Si principalmente te importa controlar a distancia un navegador con Tor (y quizás prefieras usar el Navegador Tor en lugar de Firefox), puedes usar la Marionette de Mozilla. Utilizar como
Para usar con el navegador Tor, habilite la marioneta en el inicio a través de
Browser/firefox -marionette
(dentro del paquete). Entonces, puede conectarse a través de
from marionette import Marionette
client = Marionette(''localhost'', port=2828);
client.start_session()
y cargar una nueva página, por ejemplo, a través de
url=''http://mozilla.org''
client.navigate(url);
Para más ejemplos, hay un tutorial junto con más documentación.
( copy )