2012-09-25 12 views
27

WebBrowserコントロールを使用していますが、コントロールに表示される前にHTMLコードを操作したいと思います。次の内容の例オープンサイトAの場合ユーザーに表示される前にWebブラウザーでHTMLを変更しますか?

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

私はDocumentCompletedイベントでそれを行うと、それを操作することができ知っ

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

にそれを変更したいと思います。しかし、WebサイトがDocument readyイベントで実行されるJavaScriptを実行する場合、既に実行されているため、Documentを変更するのは意味がありません。

+0

ダウンロードしたHTMLを表示する前に変更したいのですが、変更されたコードだけが表示されます。 –

+0

そうです、それはまさに私がやりたいことです。 – RaphaelH

答えて

14

あなたは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> 

あなたはBye modifiedを取得しますWebBrowserコントロールでこのコードを表示する場合。

+2

私はこのアイデアが好きです。しかし、問題は、HTML文書が少し大きければ、Webブラウザーコントロールはすべてを一度に読み取るわけではないので、ナビゲートされたイベントが呼び出されましたが、まだページがロードされています。 – RaphaelH

0

これは機能しません。私は同じ問題に直面しています。あなたがajax呼び出しを修正したいのであれば? navigateメソッドは決して起動しません。また、navigateメソッドはiFramesで決して起動しません。

唯一の解決策は、プロキシを使用することだと思います。 NuGetパッケージの追加をクリックするだけです。 fiddlercoreを検索します。一度への参照を追加します。今度は、FiddlerCoreを使用してレスポンスを変更する方法についてGoogle検索を行います。私はたくさんの例があると確信しています。

注:デフォルトでフィドラーコアを起動すると、コンピュータのプロキシ設定が変更されます。あなたはそれを望んでいない!あなたのウェブブラウザーコントロールはあなたのシステム全体ではなく、それに接続したいだけです。したがって、fidderlコアを初期化して、システムプロキシとして開始せずにランダムなポートで待機します。次に、Webブラウザコントロールを設定して、そのプロキシに接続します。

HTTPSサイトにアクセスしようとすると、それがトリッキー取得します:/

0

あなたは合理的な期間(〜20msの)とsetIntervalコールバックでこれを行うと、その後、DOM準備ができて上のように適切な時間間隔をクリアすることができ。

唯一の注意点は、コールバックが複数回呼び出されるため、コールバックが冪等でなければならないことです。既に変更したDOMノードに単にデータ属性やクラス名を追加して再度変更しないようにするだけでは、難しいとは思わないでしょう。

関連する問題