Подтвердить что ты не робот

Использование 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, который можно загрузить здесь.

4b9b3361

Ответ 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);

Дополнительные примеры: учебник вместе с дополнительной документацией.

(копировать)