C#Webbrowser在html加载的js中注入Javascript

时间:2013-06-14 14:35:59

标签: c# javascript browser inject

目前,我重新定义了window.openwindow.unload等功能;作为无效函数。

for (int C = 0; C < webBrowser1.Document.GetElementsByTagName("head").Count; C++)
            {
                HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[C];
                HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
                IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
                string alertBlocker = "window.alert = function () { }; window.print = function () { }; window.open = function () { }; window.onunload = function () { }; window.onbeforeunload = function() { };";
                element.text = alertBlocker;
                head.AppendChild(scriptEl);
            }

现在问题是网站例如通过外部javascript加载此功能并且它不存在注入:

<script src="/js/jquery.js"></script>&lt; - 例如document.onunload函数并且不是纯粹注入的。 但是,现在,程序应该搜索文档中所有已加载的Javascripts并注入代码。

映入眼帘, Bl1zz4rD

1 个答案:

答案 0 :(得分:1)

要覆盖这些Javascript函数,您需要确保它们进入正确的页面。

您可能会在页面加载中看到暂停的事件。这意味着一旦加载页面,脚本可能无法加载但仍在加载。或者绝对URL可能不是从中加载脚本的URL。

首先尝试:

public void navigateURL(string URL)
{
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(page_Loaded);
webBrowser1.Navigate(URL); 
}

void page_Loaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
MessageBox.Show(e.Url.AbsolutePath)
}

这将告诉您尝试注入代码的URL是否正确。我在某些页面上看到,e.Url.AbsolutePath可以在加载最终页面之间多次更改。在以下URL字符串中记录MessageBox中显示的URL。

private string URL1 = "<First URL to load>";
private string URL2 = "<Second URL to load>";
private string URL3 = "<Third URL to load>";

void page_Loaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (webBrowser1.Url.ToString() == "URL3")
{
// Block POP Ups...
HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
string alertBlocker = "window.alert = function () { }";
element.text = alertBlocker;
head.AppendChild(scriptEl);

this.webBrowser1.PerformLayout();

webBrowser1.DocumentCompleted -= new WebBrowserDocumentCompletedEventHandler(Page_Loaded);
}
}

我已将URL1 - 3放在那里,以便指出您需要使用的URL。

在某些情况下,我还需要实现一个Timer来等待加载对象:

void page_Loaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{          
// Wait for Objects to Load...
delaytimer.Interval = 500;
delaytimer.Enabled = true;
delaytimer.Tick += new EventHandler(PageObjects_Loaded);
delaytimer.Start();
}

void PageObjects_Loaded(object sender, WebBrowserDocumentCompletedEventArgs e)
{ 
// Do your stuff Here...
}

检查所有其他简单的事情,确保页面有头标记,可能已经有代码注入,并且代码注入head标记。

希望这有帮助。

[修改

IHTMLScriptElement位于mshtml库中,因此您需要引用: “C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Visual Studio Tools for Office \ PIA \ Common” 要么 “C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ Visual Studio Tools for Office \ PIA \ Common”

并添加:使用mshtml;

我知道你已经完成了这项工作,所以这适用于其他人。