查找网址回复?替代默认WebBrowser控件?

时间:2012-11-08 20:08:10

标签: c# webbrowser-control

大家好,我在过去几周有一个问题困扰我。

我想要实现的目标:我需要一个能够更改用户代理(一旦启动)和引用者的webbrowser控件。但最重要的是看到网址响应的能力。我的意思是,例如,如果你导航到一个网站你得到回来Images / Javascripts文件/ Dyanmic URLS作为回应我需要访问那些其中一些有动态变量的网址(常规Web浏览器控件不会告诉你那些&你除了使用fiddler核心之外,无法以任何方式访问它。

我能够通过webbrowser + fiddlercore做到这一点我可以看到并使用这些网址做任何事情。问题是如果你运行这个程序的几个实例(或者有时一次,如果程序有一些自动化来处理url响应)它会卡住或不起作用。我尝试修复它并使其工作,但它是一种无法正常工作的hacky解决方案。我需要一种简单的方法来访问这些网址,就像你使用httpwebrequest但是作为webbrowser一样。为什么我需要它作为webbrowser?我工作的方式我需要执行所有跟踪像素和脚本和图像等。一个普通的webbrowser行为在httpwebrequest中你不能只是导航,所有脚本将作为webbrowser执行,或者你可以吗?

1 个答案:

答案 0 :(得分:1)

在WinForms应用程序中使用System.Windows.Forms.WebBrowser控件,将webBrowser.URL属性设置为您感兴趣的页面的URL。

网页浏览器的DocumentCompleted事件在页面加载后触发。那时应该完成任何动态加载的JavaScript。挂钩DocumentCompleted事件并使用webbrowser.Document.Images获取页面上所有图像元素的列表。从这些图像中,您可以获得其SRC属性,其中包含其URL,包括任何挂起的查询参数。您可以使用webbrowser.Document.Links获取页面上所有超链接的列表。对于其他感兴趣的HTML元素,您可以使用GetElementsByTagName(“foo”)从页面中获取具有该标记名称的所有元素,然后挖掘其属性以提取URL属性。

使用webbrowser.Document,您可以访问任何HTML元素,无论是静态还是动态创建。

您无法通过webbrower.Document获取的内容是使用XMLHttpRequest()异步加载的数据,因为此数据不是浏览器文档对象模型的一部分。带有脚本虚假按钮的网页很难拦截。

但是,如果您知道页面上执行的JavaScript存储数据的位置,则可以使用webbrowser.Document.InvokeScript()访问它。例如,如果页面上的JavaScript将URL存储在窗口对象的mydata属性中,则可以尝试使用webbrowser.Document.InvokeScript(“window.mydata”)或某些变体来将mydata的值检索到C#app中。 / p>