28

我正在使用 WebBrowser 控件,我想在 HTML 代码显示在控件中之前对其进行操作。

例如打开网站A,内容如下:

<html>
  <body>
    <p id="Text">Hello</p>
  </body>
</html>

我想把它改成

<html>
  <body>
    <p id="Text">Bye</p>
  </body>
</html>

我知道我可以使用 DocumentCompleted 事件来做到这一点,然后对其进行操作。但是,如果网站执行了在 Document ready 事件上执行的 JavaScript 内容,那么更改它就没有意义,因为它已经被执行了。

4

3 回答 3

16

您可以在Navigated事件中进行 DOM 操作:

webBrowser1.Navigated += (sender, e) =>
{
    ((WebBrowser)sender).Document.GetElementById("Text").InnerHtml = "Bye";
};

这将在文档中的任何 DOM 就绪处理程序之前执行。例如,如果您最初有以下 HTML:

<html>
<head>
    <title>Test</title>
</head>
<body onload="document.getElementById('Text').innerHTML = document.getElementById('Text').innerHTML + ' modified';">
    <p id="Text">Hello</p>
</body>
</html>

当您在 WebBrowser 中显示此代码时,您将获得Bye modified.

于 2013-01-07T07:01:12.280 回答
0

这不起作用。我面临同样的问题。如果你想修改ajax调用怎么办?导航方法永远不会触发。此外,导航方法永远不会在 iFrame 上触发。

我认为唯一的解决方案是使用代理。只需单击添加 NuGet 包。搜索提琴手核心。添加对http://www.telerik.com/fiddler/fiddlercore的引用后。现在只需对如何使用 FiddlerCore 修改响应进行谷歌搜索。我相信会有很多例子。

注意:默认情况下启动提琴手核心时,它将更改您的计算机代理设置。你不希望出现这种情况!您只希望您的网络浏览器控件连接到它,而不是您的整个系统。因此初始化 fiddlel 核心以在随机端口进行侦听,而无需作为系统代理启动。然后将您的网络浏览器控件设置为连接到该代理。

尝试访问 HTTPS 站点时会变得更加棘手:/

于 2015-08-21T14:23:12.413 回答
0

您可以在setInterval回调中以合理的间隔(约 20 毫秒)执行此操作,然后在适当的时间清除间隔,例如在 DOM 准备好时。

唯一需要注意的是,您的回调需要是幂等的,因为它会被多次调用。如果您只是将数据属性或类名添加到您已经修改过的 DOM 节点,我认为这不会很困难,这样它们就不会再次被修改。

于 2015-08-28T01:02:45.560 回答