目前,我重新定义了window.open
,window.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
答案 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;
我知道你已经完成了这项工作,所以这适用于其他人。