c# - 在 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# - 更改 DataContext 时,CollectionViewSource 排序在 DataGrid 中停止工作
- xslt - 将变量分配给在 xslt 的循环中选择的值
- c# - 带有大写十六进制字符的 HttpUtility.UrlEncode
- javascript - 为 POSTMAN 中单个数据文件中指定的 GET 和 POST 请求运行集合
- spring-boot - 如何在 SimpleUrlAuthenticationFailureHandler 中找到哪个 AuthenticationProvider/Filter 失败?
- php - 创建动态 404 页面
- angular - 安装时不显示离子cordova-plugin-android-permissions
- mysql - 使用 SQL (MySQL) 选择一周中的每隔一天
- vbscript - 在网页上查找值并返回消息提示的 VBScript
- unity3d - 使用触发事件创建 2D 精灵?