C# Selenium - 无法启动 Tor

标签 c# selenium firefox geckodriver tor

我尝试使用以下代码在 C# 中通过 Selenium 启动 Tor 浏览器:

using OpenQA.Selenium.Firefox;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AutomatorApp
{
  public class BrowserAutomator
  {
     public void Automate()
     {

        String torPath = "D:\\Tor Browser\\Browser\\firefox.exe";
        String profilePath = "D:\\Tor Browser\\Browser\\TorBrowser\\Data\\Browser\\profile.default\\";

        FirefoxProfile profile = new FirefoxProfile(profilePath);
        profile.SetPreference("network.proxy.type", 1);
        profile.SetPreference("network.proxy.socks", "127.0.0.1");
        profile.SetPreference("network.proxy.socks_port", 9153);
        profile.SetPreference("network.proxy.socks_remote_dns", false);

        FirefoxDriverService firefoxDriverService = FirefoxDriverService.CreateDefaultService("D:\\geckodriver-v0.26.0-win64", "geckodriver.exe");
        firefoxDriverService.FirefoxBinaryPath = torPath;

        var firefoxOptions = new FirefoxOptions
        {
            Profile = profile,
            LogLevel = FirefoxDriverLogLevel.Trace
        };

        FirefoxDriver driver = new FirefoxDriver(firefoxDriverService, firefoxOptions);
      }
   }
}

但是,这会显示错误“Tor 无法启动”,并且异常仅包含“权限被拒绝”。我尝试以管理员模式启动应用程序并确保所有用户都可以访问该文件夹,但这并没有解决问题。

有趣的是,当我尝试使用相同的设置启动 Firefox 浏览器时,它运行良好。

非常感谢任何帮助。

更新 - 已解决:更新到最新的 Tor 版本(9.5.1)后最终工作代码:

            FirefoxProfile profile = new FirefoxProfile(profilePath);
            profile.SetPreference("network.proxy.type", 1);
            profile.SetPreference("network.proxy.socks", "127.0.0.1");
            profile.SetPreference("network.proxy.socks_port", 9153);
            profile.SetPreference("network.proxy.socks_remote_dns", false);

            FirefoxDriverService firefoxDriverService = FirefoxDriverService.CreateDefaultService(geckoDriverDirectory);
            firefoxDriverService.FirefoxBinaryPath = torPath;
            firefoxDriverService.BrowserCommunicationPort = 2828;
            var firefoxOptions = new FirefoxOptions
            {
                Profile = null,
                LogLevel = FirefoxDriverLogLevel.Trace
            };
            firefoxOptions.AddArguments("-profile", profilePath);
            FirefoxDriver driver = new FirefoxDriver(firefoxDriverService, firefoxOptions);
            driver.Navigate().GoToUrl("https://www.google.com");

重要说明:

需要在 about:config 中更改以下 TOR 配置:

  • ma​​rionette.enabled:true

  • ma​​rionette.port:设置为未使用的端口,并在代码中将此值设置为 firefoxDriverService.BrowserCommunicationPort。在我的示例中,该值设置为 2828。

最佳答案

据我几年前的尝试,当您设置“Profile”选项时,带有 WebDriver 的 TOR 不起作用。普通的 Firefox 可以工作,但 TOR 根本不行。

如果此后出现超时错误,请确保在 about:config 上启用 marionette。如果已启用,请在启动时跟踪 TOR 的情况。例如,如果实际的 Firefox 浏览器未加载、卡在连接启动器等,或者浏览器启动时出现消息框或其他内容...并且还要确保没有其他 firefox.exegeckodriver.exetor.exe 正在后台运行。如果多个可执行文件未配置为监听不同的端口号,则可能会导致问题。

    Environment.SetEnvironmentVariable("webdriver.gecko.driver", "C:\\TorBrowser\\Browser\\geckodriver.exe");
    var gekcoService = FirefoxDriverService.CreateDefaultService("C:\\TorBrowser\\Browser", "geckodriver.exe");
    var gekcoService.FirefoxBinaryPath = "C:\\TorBrowser\\Browser\\firefox.exe";

    // marionette port that browser listens to. I had it set to a custom port on about:config
    var gekcoService.BrowserCommunicationPort = 50111; 

    // also had given a custom port for geckodriver listen port
    var gekcoService.Port = 9881; 
    var gekcoService.Host = 127.0.0.1;
    var gekcoService.HostName = 127.0.0.1;
    var gekcoService.Start();
    
    var ffOptions = new FirefoxOptions
    {
        AcceptInsecureCertificates = true,
        BrowserExecutableLocation = "C:\\TorBrowser\\Browser\\firefox.exe",
        Profile = null, 
        UnhandledPromptBehavior = UnhandledPromptBehavior.Dismiss
    };
    
    ffOptions.AddArguments("-profile", "C:\\TorBrowser\\Browser\\TorBrowser\\Data\\Browser\\profile.default");
    ffOptions.LogLevel = FirefoxDriverLogLevel.Info;
    ffOptions.PageLoadStrategy = PageLoadStrategy.Eager;
    var ffDriver = new FirefoxDriver(gekcoService, ffOptions);
    ffDriver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(10);
    ffDriver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromSeconds(10);
    ffDriver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(30);

关于C# Selenium - 无法启动 Tor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62645805/

相关文章:

c# - 如何从 UWP TimePicker 中删除按钮

c# - 延迟模板字符串插值

java - Linux IntelliJ Chrome WebDriverManager "chrome (or any other browser) failed to start"

google-chrome - Golang Selenium 包 - 连接到 selenium 服务器和 headless chrome

javascript - 网站在除 Firefox 以外的其他浏览器上运行良好

c# - 将 C# 连接到 MySQL 并打开连接

c# - 等效的 LINQ to SQL 代码

java - Testng 6.9.10 assertEquals() 没有像它应该的那样失败

javascript - 在所有浏览器中使用 window.opener 的问题

javascript - FF Javascript 文本框样式问题