使用Watin更改IE实例的代理设置

Joh*_*han 10 c# asp.net watin unit-testing

我知道我可以更改计算机全局代理设置Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings,以影响使用Watin创建的IE实例.

但有没有办法拦截IE浏览器发出的请求并通过代理运行它们?我的目标是运行IE的多个实例,每个实例都有自己的代理,这对于我上面的当前解决方案是不可能的.

kha*_*han 4

WatiN IE 创建多个ProcessID(单实例 IE 创建多个进程 ID)。为了使用Fiddler Core覆盖 WatiN 的代理设置,我们需要获取由 WatiN IE 创建的所有子进程 ID。可以在此处找到帮助程序类PInvoke:获取窗口 \xe2\x80\x93 Svett Ralchev 类的所有子句柄。然后我们检查BeforeRequest中的所有进程 ID事件中的所有进程 ID,并等待 watin 进程 ID 覆盖代理设置。

\n\n
    private void FiddlerApplication_BeforeRequest(Session sess)\n    {\n        //Debug.WriteLine("FiddlerApplication_BeforeRequest: " + sess.LocalProcessID.ToString());\n        if (WatinIEprocessHolder.ContainsKey(sess.LocalProcessID))\n        {                \n            //see http://stackoverflow.com/questions/14284256/how-to-manually-set-upstream-proxy-for-fiddler-core\n            sess["X-OverrideGateway"] = WatinIEprocessHolder[sess.LocalProcessID];\n        }\n    } \n
Run Code Online (Sandbox Code Playgroud)\n\n

工作测试申请可以在这里下载http://www.rentanadviser.com/downloads/WatiN-2.1.0.1196.zip

\n\n

下面是使用不同匿名代理的测试结果。(ip地址=浏览器.文本)

\n\n
Process Ids:3852,7852,, Your IP address: 119.46.110.17, Proxy:119.46.110.17:8080\nProcess Ids:2508,6948,, Your IP address: 178.21.112.27, Proxy:178.21.112.27:3128\nProcess Ids:1348,1368,, Your IP address: 122.96.59.107, Proxy:122.96.59.107:83\nProcess Ids:7152,5104,, Your IP address: 136.0.16.217, Proxy:136.0.16.217:3127\nProcess Ids:4128,3480,, Your IP address: 198.52.199.152, Proxy:198.52.199.152:7808\nProcess Ids:2036,7844,, Your IP address: 122.96.59.107, Proxy:122.96.59.107:82\n
Run Code Online (Sandbox Code Playgroud)\n\n

示例代码:

\n\n
    private void this_FormClosing(object sender, FormClosingEventArgs e)\n    {\n        StopFiddler();\n    }\n\n    private void Form1_Load(object sender, EventArgs e)\n    {\n        this.FormClosing += this_FormClosing;\n\n        ProxyHolder = new List<string>();\n        ProxyHolder.Add("119.46.110.17:8080");\n        ProxyHolder.Add("178.21.112.27:3128");\n        ProxyHolder.Add("122.96.59.107:83");\n        ProxyHolder.Add("136.0.16.217:3127");\n        ProxyHolder.Add("198.52.199.152:7808");\n        ProxyHolder.Add("122.96.59.107:82");\n\n        StartFiddler();\n        System.Threading.Thread.Sleep(500);\n\n        for (var i = 0; i < ProxyHolder.Count; i++)\n        {\n            WhatIsMyIpThroughProxy(ProxyHolder[i]);\n            Application.DoEvents();\n            System.Threading.Thread.Sleep(500);\n        }\n        //WhatIsMyIpThroughProxy();\n    }\n\n    private Dictionary<int, string> WatinIEprocessHolder = new Dictionary<int, string>();\n    private List<string> ProxyHolder = null;\n\n    public void WhatIsMyIpThroughProxy(string ProxyIPandPort)\n    {\n\n        using (var browser = new IE(true))// we should not navigate now. Because we need process ids.\n        {\n            WindowHandleInfo ChildHandles = new WindowHandleInfo(browser.hWnd);\n            foreach (var cHandle in ChildHandles.GetAllChildHandles())\n            {\n                int pid = new WatiN.Core.Native.Windows.Window(cHandle).ProcessID;\n                if (WatinIEprocessHolder.ContainsKey(pid) == false)\n                    WatinIEprocessHolder.Add(pid, ProxyIPandPort);\n            }\n\n            System.Text.StringBuilder processIDs = new System.Text.StringBuilder();\n            foreach (var k in WatinIEprocessHolder.Keys)\n            {\n                processIDs.Append(k.ToString() + ",");\n                //Debug.WriteLine(string.Format("{0}:{1}", k, WatinIEprocessHolder[k]));\n            }\n\n            //we got the process ids above. Navigate now.\n            browser.GoTo("http://www.rentanadviser.com/en/common/tools.ashx?action=whatismyip");\n            browser.WaitForComplete();\n\n            WatinIEprocessHolder.Clear();\n\n            System.Net.IPAddress ip;\n            if (System.Net.IPAddress.TryParse(browser.Text, out ip))\n            {\n                Debug.WriteLine(string.Format("Process Ids:{0}, Your IP address: {1}, Proxy:{2}", processIDs.ToString(), browser.Text, ProxyIPandPort));\n            }\n            else\n            {\n                Debug.WriteLine(string.Format("Process Ids:{0}, Your IP address: {1}, Proxy:{2}", processIDs.ToString(), "Failed", ProxyIPandPort));\n            }\n        }\n    }\n\n\n    private void StartFiddler()\n    {\n        FiddlerApplication.BeforeRequest += FiddlerApplication_BeforeRequest;\n        FiddlerApplication.Startup(8888, true, true, true);\n    }\n\n    private void StopFiddler()\n    {\n        FiddlerApplication.BeforeRequest -= FiddlerApplication_BeforeRequest;\n        if (FiddlerApplication.IsStarted())\n        {\n            FiddlerApplication.Shutdown();\n        }\n    }\n\n\n    private void FiddlerApplication_BeforeRequest(Session sess)\n    {\n        //Debug.WriteLine("FiddlerApplication_BeforeRequest: " + sess.LocalProcessID.ToString());\n        if (WatinIEprocessHolder.ContainsKey(sess.LocalProcessID))\n        {                \n            //see http://stackoverflow.com/questions/14284256/how-to-manually-set-upstream-proxy-for-fiddler-core\n            sess["X-OverrideGateway"] = WatinIEprocessHolder[sess.LocalProcessID];\n        }\n    }    \n
Run Code Online (Sandbox Code Playgroud)\n