在Selenium中为Chrome Driver设置代理

23

我正在使用C#编写的Selenium Webdriver来自动化Chrome浏览器。我需要检查我的网页是否在某些地区(一些IP范围内)被屏蔽。因此,我必须在Chrome浏览器中设置代理服务器。我尝试了下面的代码,代理服务器已经设置好了,但是我遇到了一个错误。请问能有人帮帮我吗?

ChromeOptions options = new ChromeOptions();
options.AddArguments("--proxy-server=XXX.XXX.XXX.XXX");

IWebDriver Driver = new ChromeDriver(options);
           
Driver.Navigate().GoToUrl("myUrlGoesHere");
当我运行这段代码时,在我的Chrome浏览器中会收到以下消息: 我试图启用代理选项,但“更改代理设置”选项被禁用。 无法连接到代理服务器。代理服务器是一台充当您计算机和其他服务器之间中介的服务器。您的系统当前配置为使用代理,但Google Chrome无法连接到它。 如果您使用代理服务器... 请检查您的代理设置或联系您的网络管理员以确保代理服务器正常工作。 如果您认为自己不应该使用代理服务器:转到Chrome菜单>设置>显示高级设置...>更改代理设置...>局域网设置并取消选择“使用代理服务器为LAN”,错误代码:ERR_PROXY_CONNECTION_FAILED*。

如果您在Chrome代理中看到了XXX.XXX.XXX.XXX,那么这与Selenium无关;这是因为XXX.XXX.XXX.XXX没有启动或拒绝了您的连接。您应该先确保XXX.XXX.XXX.XXX正常工作。 - Nguyen Vu Hoang
3个回答

23

我正在使用Selenium 2.50.1的NuGet软件包:

ChromeOptions options = new ChromeOptions();
proxy = new Proxy();
proxy.Kind = ProxyKind.Manual;
proxy.IsAutoDetect = false;
proxy.HttpProxy =
proxy.SslProxy = "127.0.0.1:3330";
options.Proxy = proxy;
options.AddArgument("ignore-certificate-errors");
var chromedriver = new ChromeDriver(options);

1
@Toolkit,您可以尝试使用SocksUserNameSocksPassword属性。 - Bron Davies
@BronDavies,我已经尝试使用这些属性,但是在chromeDriver中仍然弹出要求输入登录和密码的弹窗。是否已经存在解决方案? - ovasylenko
@ovasylenko 如果您能提出一个新问题并粘贴您的代码,我可以看出可能缺少什么。 - Bron Davies
为什么 HttpProxy 属性等于空? - Guy_g23
@guy_g23 proxy.HttpProxy = proxy.SslProxy = "127.0.0.1:3330"; 相当于 proxy.HttpProxy = "127.0.0.1:3330"; proxy.SslProxy = "127.0.0.1:3330"; - Bron Davies
显示剩余2条评论

9
如果您的代理需要用户登录,可以按照以下方式设置带有登录用户名和密码详情的代理:
options.AddArguments("--proxy-server=http://user:password@yourProxyServer.com:8080");

1
--proxy-server=socks5:// 在 socks 5 代理后面添加 "socks5://" - Shawn S.

7
请按照以下代码操作,这将帮助您更改代理。

首先创建Chrome扩展程序并粘贴以下JavaScript代码。

JavaScript代码

var Global = {
    currentProxyAouth: {
        username: '',
        password: ''
    }
}

var userString = navigator.userAgent.split('$PC$');
if (userString.length > 1) {
    var credential = userString[1];
    var userInfo = credential.split(':');
    if (userInfo.length > 1) {
        Global.currentProxyAouth = {
            username: userInfo[0],
            password: userInfo[1]
        }
    }
}

chrome.webRequest.onAuthRequired.addListener(
    function(details, callbackFn) {
        console.log('onAuthRequired >>>: ', details, callbackFn);
        callbackFn({
            authCredentials: Global.currentProxyAouth
        });
    }, {
        urls: ["<all_urls>"]
    }, ["asyncBlocking"]);


chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        console.log('Background recieved a message: ', request);

        POPUP_PARAMS = {};
        if (request.command && requestHandler[request.command])
            requestHandler[request.command](request);
    }
);

C# 代码

    var cService = ChromeDriverService.CreateDefaultService();
    cService.HideCommandPromptWindow = true;

    var options = new ChromeOptions();

    options.AddArguments("--proxy-server=" + "<< IP Address >>" + ":" + "<< Port Number >>");
    options.AddExtension(@"C:\My Folder\ProxyChanger.crx");

    options.Proxy = null;

    string userAgent = "<< User Agent Text >>";

    options.AddArgument($"--user-agent={userAgent}$PC${"<< User Name >>" + ":" + "<< Password >>"}");

    IWebDriver _webDriver = new ChromeDriver(cService, options);

    _webDriver.Navigate().GoToUrl("https://whatismyipaddress.com/");

如果浏览器处于“--headless”模式,该怎么办?这种情况下扩展程序无法工作... - ovasylenko
参考此链接 >>>> https://dev59.com/-1cO5IYBdhLWcg3wsjtk#45372648 - Gehan Fernando
我在哪里可以找到File ProxyChanger.crx? - confusedMind
我看到一些关于代理的参考资料,但如果您想使用Selenium提交URL并跟踪在Chrome开发工具中的网络选项卡中显示的页面生成期间调用的所有外部URL,那该怎么做呢?首先,我认为大多数人没有提到的一件事是,您需要设置一个实际的代理服务器才能使初始代码正常工作。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接