C#Selenium Firefox使用Auth设置袜子代理

时间:2019-10-28 00:20:38

标签: c# selenium selenium-webdriver geckodriver selenium-firefoxdriver

在C#中,我试图在firefox中设置具有身份验证的袜子代理。

这不起作用

    Proxy proxy = new Proxy();
    proxy.SocksProxy = sProxyIP + ":" + sProxyPort;
    proxy.SocksUserName = sProxyUser;
    proxy.SocksPassword = sProxyPass;
    options.Proxy = proxy;
    _driver = new FirefoxDriver(service, options);

这也不行

   profile.SetPreference("network.proxy.socks", sProxyUser + ":" + sProxyPass + "@" + sProxyIP + ":" + sProxyPort);
   profile.SetPreference("network.proxy.socks_port", sProxyPort);

我该如何解决?

2 个答案:

答案 0 :(得分:0)

据我所知,您无法使用Firefox做到这一点。您需要添加一个新的Firefox配置文件,然后将其与Selenium一起使用。在此配置文件上,您需要保存代理信息以及用户名和密码。

您可以按照以下步骤link设置Firefox配置文件。这样就很容易完成这项工作。我使用该代码:

FirefoxProfile profile = new FirefoxProfile(pathToProfile);
FirefoxOptions options = new FirefoxOptions();
options.Profile = profile;
driver = new FirefoxDriver(options);

然后,您将不得不取消显示有关用户名和密码验证的警报。您可以使用两种方法来做到这一点。第一个是以编程方式进行。像这样:

 var alert = driver.SwitchTo().Alert();
 alert.Accept();

另一种方法是从Firefox配置文件设置中完成该操作。

答案 1 :(得分:0)

经过大量研究,这是我决定采用的解决方案。

这是一个肮脏的hack,但它可以工作。

我使用AutoitX来实现代理身份验证窗口的自动化,但是由于我的应用将是多线程的,因此不得不使用System.Windows.Automation来获得正确的身份验证窗口。

sProxyIP = "154.5.5.5";
sProxyUser = "user here";
sProxyPass = "pass here";
sProxyPort = 4444;

//Set proxy
profile.SetPreference("network.proxy.socks", sProxyIP);
profile.SetPreference("network.proxy.socks_port", sProxyPort);


//deal with proxy auth
_driver.Manage().Timeouts().PageLoad = TimeSpan.FromMilliseconds(0);
WebsiteOpen(@"https://somewebsite.com/");
AuthInProxyWindow(sProxyUser, sProxyPass);
_driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(60);



void ProxyAuthWindow(string login, string pass)
{
    try
    {   
        //wait for the auth window
        var sHwnd = AutoItX.WinWait("Authentication Required", "", 2);
        AutoItX.WinSetOnTop("Authentication Required", "", 1);

        //we are using Windows UIA so we make sure we got the right auth
         //dialog(since there will be multiple threads we can easily hit the wrong one)
        var proxyWindow = AutomationElement.RootElement.FindFirst(TreeScope.Subtree,
            new PropertyCondition(AutomationElement.ClassNameProperty, "MozillaDialogClass"));
        string hwnd = "[handle:" + proxyWindow.Current.NativeWindowHandle.ToString("X") + "]";
        AutoItX.ControlSend(hwnd, "", "", login, 1);
        AutoItX.ControlSend(hwnd, "", "", "{TAB}", 0);
        AutoItX.ControlSend(hwnd, "", "", pass, 1);
        AutoItX.ControlSend(hwnd, "", "", "{ENTER}", 0);
    }
    catch
    {

    }


}