首页 > 解决方案 > 在 C# (.NET Core 3.1) 上的 Selenium Firefox 中使用 Socks5 代理服务器导致超时

问题描述

我有一个正在运行的本地代理服务器,127.0.0.1:5001它使用 SSH 转发到远程服务器。我的 Selenium Firefox 实例应该使用它。此方法已弃用,Selenium 建议改用该方法FirefoxOptions。所以我尝试了以下简单的 POC 并将其修改为使用 socks 而不是 http 代理:

using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using System;

namespace SeleniumProxyTest {
    class Program {
        static void Main(string[] args) {
            var opts = new FirefoxOptions();
            var proxy = new Proxy();
            proxy.Kind = ProxyKind.Manual;
            proxy.SocksProxy = "127.0.0.1:5002";
            opts.Proxy = proxy;

            var driver = new FirefoxDriver(opts);
            driver.Navigate().GoToUrl("https://www.perfect-privacy.com/de/tests/check-ip");

            Console.WriteLine("Finished");
            Console.ReadLine();
        }
    }
}

但一段时间后,在创建过程中发生异常FirefoxDriver

InvalidArgumentError:预期“socksVersion”为正整数,得到 [object Undefined] undefined (SessionNotCreated)

但是OpenQA.Selenium.Proxy该类不包含任何与 socks 版本相关的属性。

我试过的

在代理 url 中设置协议

proxy.SocksProxy = "socks5://127.0.0.1:5002";

导致不应指定协议的错误:

OpenQA.Selenium.WebDriverException:“socksProxy 不得包含方案:socks5://127.0.0.1:5002”

socksVersion在构造函数中设置为设置

我发现该类的构造函数Proxy接受一个设置字典。由于异常需要特定属性,因此我尝试在那里设置版本:

var proxySettings = new Dictionary<string, object>() { { "socksVersion", 5 } };
var proxy = new Proxy(proxySettings);

由于 Selenium 是开源的,我可以通过查看Proxy.cs从提供的设置字典中获取版本的类来确认这个假设。所以我的代码应该可以工作。

现在我摆脱了socketVersion错误。但是,它仍然不起作用,现在它会浪费时间new FirefoxDriver

OpenQA.Selenium.WebDriverException:“对 URL http://localhost:32904/session 的远程 WebDriver 服务器的 HTTP 请求在 60 秒后超时。”

Selenium 的 Firefox 窗口在该异常之前已打开,但未完成导航,并且代理设置设置为默认使用系统的代理设置

在此处输入图像描述

由于 Firefox 窗口已打开并Listening on 127.0.0.1:45089在控制台中显示,我认为我的 .NET Core 应用程序和 geckodriver 之间的本地通信由于代理而无法正常工作。所以我添加了例外:

proxy.AddBypassAddresses(new string[] { "localhost", "127.0.0.1" });

这些似乎没有帮助。如上面的屏幕截图所示,网络配置中仍然没有代理条目。

使用 HTTP 代理有效

奇怪的是,当我在 127.0.0.1 上设置 HTTP 而不是 Socks5 代理时,它可以正常工作,而本地地址没有任何例外规则。

编辑:首选项也不起作用

将此示例翻译为 C#,它将代理直接设置为配置文件中的首选:

var profile = new FirefoxProfile();
profile.SetPreference("network.proxy.type", 1);
profile.SetPreference("network.proxy.socks", "127.0.0.1");
profile.SetPreference("network.proxy.socks_port", 5002);
profile.SetPreference("network.proxy.socks_remote_dns", true);

var opts = new FirefoxOptions();
opts.Profile = profile;
var driver = new FirefoxDriver(opts);

现在 Firefox 导航到 URL 没有超时,但没有设置或使用代理。

所以我想知道为什么它不能在 Socks5 代理上工作,我需要改变什么才能让它工作?

使用的软件包版本:

<PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
<PackageReference Include="Selenium.WebDriver.GeckoDriver" Version="0.29.1" />

标签: c#seleniumfirefox.net-coreproxy

解决方案


推荐阅读