web-dev-qa-db-ja.com

ユーザーに表示される前にWebBrowserのHTMLを変更しますか?

WebBrowserコントロールを使用していますが、コントロールに表示される前にHTMLコードを操作したいと思います。

たとえば、次のコンテンツを含むWebサイトAを開きます。

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

に変更したい

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

DocumentCompletedイベントでそれを実行し、それを操作できることはわかっています。しかし、WebサイトがDocument readyイベントで実行されるJavaScriptを実行する場合、それはすでに実行されているため、変更しても意味がありません。

28
RaphaelH

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が表示されます。

15
Darin Dimitrov

これは動作しません。私は同じ問題に直面しています。 ajax呼び出しを変更したい場合はどうなりますか?ナビゲートメソッドは起動しません。また、navigateメソッドがiFrameで起動することはありません。

唯一の解決策はプロキシを使用することだと思います。 NuGetパッケージの追加をクリックするだけです。 fiddlercoreを検索します。 http://www.telerik.com/fiddler/fiddlercore への参照を追加したら。次に、FiddlerCoreを使用して応答を変更する方法をグーグル検索します。きっとたくさんの例があると思います。

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

HTTPSサイトにアクセスしようとすると、注意が必要になります:/

1
Tono Nam

これは、適切な間隔(〜20ms)でsetIntervalコールバックで実行し、DOMの準備ができている場合などの適切な時間に間隔をクリアすることができます。

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

0
aleemb