在向用户显示之前更改WebBrowser中的HTML?

时间:2012-09-25 17:01:23

标签: c# web browser

我正在使用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内容,那么更改它就没有意义,因为它已经被执行了。

2 个答案:

答案 0 :(得分:15)

您可以在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

答案 1 :(得分:1)

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

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

注意:默认启动fiddler核心时,它会更改您的计算机代理设置。你不希望出现这种情况!您只希望您的webbrowser控件连接到它而不是整个系统。因此初始化fidderl核心来监听随机端口,而不是作为系统代理启动。然后设置webbrowser控件以连接到该代理。

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