0

現在、関数window.openwindow.unloadなどを再定義しています。void 関数として。

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>←例えばdocument.onunload関数があり、純粋に注入されていません。ただし、プログラムはドキュメント内に読み込まれたすべての Javascript を検索し、コードも挿入する必要があります。

こんにちは、Bl1zz4rD

4

1 に答える 1

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 は、最終ページの読み込みの間に数回変更される可能性があります。MessageBox に表示される URL を次の 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);
}
}

使用する必要がある可能性のある URL を示すために、そこに URL1 から 3 を入れました。

状況によっては、オブジェクトが読み込まれるのを待つために 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 タグがあること、既にコード インジェクションが行われている可能性があること、およびコードが 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 を使用。

あなたはすでにこれを行っているようですので、これは他の人のためのものです。

于 2013-09-21T23:48:29.513 に答える