Joh*_*han 10 c# asp.net watin unit-testing
我知道我可以更改计算机全局代理设置Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings,以影响使用Watin创建的IE实例.
但有没有办法拦截IE浏览器发出的请求并通过代理运行它们?我的目标是运行IE的多个实例,每个实例都有自己的代理,这对于我上面的当前解决方案是不可能的.
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 } \nRun Code Online (Sandbox Code Playgroud)\n\n工作测试申请可以在这里下载http://www.rentanadviser.com/downloads/WatiN-2.1.0.1196.zip
\n\n下面是使用不同匿名代理的测试结果。(ip地址=浏览器.文本)
\n\nProcess 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\nRun 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 } \nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1923 次 |
| 最近记录: |