Использование Selenium WebDriver с Tor
Поскольку Tor Browser Bundle - это просто исправленная версия Firefox, кажется, что с помощью Tor Browser можно использовать FirefoxDriver
. Это то, что я пробовал до сих пор:
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");
Это приведет к открытию пустой страницы браузера Tor со всплывающим сообщением: ваш профиль Firefox не может быть загружен. Он может отсутствовать или недоступен.
Я знаю, что профиль действителен/совместим, потому что я могу успешно запустить браузер и профиль с помощью
binary.startProfile(profile, profilePath, ""));
Я не знаю, как отправлять команды в браузер, открытый таким образом.
Я нашел похожие вопросы, но я специально ищу решение Java, желательно тестируемое в Windows.
Я использую автономную библиотеку Selenium, которую можно скачать здесь и пакет Tor Browser Bundle, который можно загрузить здесь.
Ответы
Ответ 1
Поскольку Tor Browser Bundle не позволял мне использовать расширение WebDriver, я нашел обходное решение, в котором я запускал Tor из обычного браузера Firefox. С помощью этого метода, пока Tor Browser открыт, вы можете использовать Tor с обычным браузером Firefox.
-
Браузер Open 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();
}
-
Откройте Firefox с некоторыми конфигурациями:
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);
-
Закрыть браузеры. Обратите внимание, что если вы планируете много делать закрытие и повторное открытие (полезно для получения нового IP-адреса), я рекомендую установить для параметра предпочтения toolkit.startup.max_resumed_crashes
высокое значение, например 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;
}
Ответ 2
Я бы попробовал указать путь к одному из существующих профилей и инициализировать ваш экземпляр профиля для Tor, чтобы ваш код выглядел примерно так:
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");
Я не пробовал это, так как у меня нет настройки WebDriver дома, но это должно позволить вам указать профиль.
Ответ 3
Я загрузил TorBrowser, и я смог вызвать его без каких-либо проблем, со следующим кодом (это Mac OS).
Поэтому я думаю, что не должно быть никаких проблем с совместимостью между firefox webdriver и последней версией 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");
Я знаю, что вы уже тестировали путь своего профиля с помощью binary.startProfile
, но я думаю, вы могли бы попробовать снова использовать косую черту вместо обратного слэша, чтобы указать путь, перекрестно проверить, существует ли этот файл → profile.default
, и используйте абсолютный путь вместо относительного → ../
.
Ответ 4
Этот код также хорошо работает в ubuntu.
Вот пример (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
}
}
Ответ 5
Если вы в основном заботитесь о дистанционном управлении браузером с помощью Tor (и, возможно, предпочитаете использовать Tor Browser вместо vanilla Firefox), вы можете использовать Mozilla Marionette. Использовать как
Чтобы использовать браузер Tor, включите марионетку при запуске через
Browser/firefox -marionette
(внутри расслоения). Затем вы можете подключиться через
from marionette import Marionette
client = Marionette('localhost', port=2828);
client.start_session()
и загрузите новую страницу, например, через
url='http://mozilla.org'
client.navigate(url);
Дополнительные примеры: учебник вместе с дополнительной документацией.
(копировать)