16

ページと JavaScript 関数をテストする目的で、WebBrowser コントロールを介してプログラムで Web ページをロードしようとしています。基本的に、このコントロールを介して実行される HTML と JavaScript を既知の出力と比較して、問題があるかどうかを確認したいと考えています。

ただし、WebBrowser コントロールを作成してナビゲートするだけでは問題があります。以下のコードは、HtmlDocument を WebBrowser.Document プロパティにロードするためのものです。

WebBrowser wb = new WebBrowser();
wb.AllowNavigation = true;

wb.Navigate("http://www.google.com/");

Navigate() の実行後に Intellisense を介して Web ブラウザーの状態を調べると、WebBrowser.ReadyState は「未初期化」、WebBrowser.Document = null であり、呼び出しによって全体的にまったく影響を受けていないように見えます。

文脈上の注意として、私はこのコントロールを Windows フォーム オブジェクトの外で実行しています。ウィンドウをロードしたり、実際にページを見たりする必要はありません。要件により、ページの JavaScript を実行し、結果の HTML を調べるだけで済みます。

どんな提案でも大歓迎です、ありがとう!

4

4 に答える 4

19

WebBrowser.DocumentComplete イベントを処理する必要があります。そのイベントが発生すると、Document などがあります。

wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);


private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
  WebBrowser wb = sender as WebBrowser;
  // wb.Document is not null at this point
}

これは、Windows フォーム アプリケーションで簡単に実行してテストした完全な例です。

public partial class Form1 : Form
  {
    public Form1()
    {      
      InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      WebBrowser wb = new WebBrowser();
      wb.AllowNavigation = true;

      wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);

      wb.Navigate("http://www.google.com");

              }

    private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
      WebBrowser wb = sender as WebBrowser;
      // wb.Document is not null at this point
    }
  }

編集: これは、コンソール アプリケーションからウィンドウを実行する単純なバージョンのコードです。もちろん、さらに進んで、イベントをコンソール コードなどに公開することもできます。

using System;
using System.Windows;
using System.Windows.Forms;

namespace ConsoleApplication1
{
  class Program
  {    
    [STAThread] 
    static void Main(string[] args)
    {      
      Application.Run(new BrowserWindow());   

      Console.ReadKey();
    }
  }

  class BrowserWindow : Form
  {
    public BrowserWindow()
    {
      ShowInTaskbar = false;
      WindowState = FormWindowState.Minimized;
      Load += new EventHandler(Window_Load);
    }

    void Window_Load(object sender, EventArgs e)
    {      
      WebBrowser wb = new WebBrowser();
      wb.AllowNavigation = true;
      wb.DocumentCompleted += wb_DocumentCompleted;
      wb.Navigate("http://www.bing.com");      
    }

    void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
      Console.WriteLine("We have Bing");
    }
  }
}
于 2010-04-30T20:22:34.170 に答える
3

おそらく、親ウィンドウでコントロールをホストする必要があります。これは、ブラウザー コントロールをホストするウィンドウを画面外に移動して表示しないようにするだけで、要件に違反することなく実行できます。テストや検証などのために実際に何かをロードすることを「確認」することも、開発に役立つ場合があります。

だから試してください:

// in a form's Load handler:

WebBrowser wb = new WebBrowser();
this.Controls.Add(wb);
wb.AllowNavigation = true;
wb.Navigate("http://www.google.com/");

また、IDE を使用して WebBrowser オブジェクトをインスタンス化するときに、WebBrowser オブジェクトに設定されているその他のプロパティを確認してください。たとえば、フォームを作成し、そこにブラウザ コントロールをドロップしてから、フォームのデザイナ ファイルをチェックして、生成されたコードを確認します。設定が必要ないくつかの重要なプロパティが欠落している可能性があります。このようにして、コードの多くの省略を発見し、視覚オブジェクトをプログラムで適切にインスタンス化する方法も学びました。

PS ホスト ウィンドウを使用する場合は、開発中にのみ表示する必要があります。生産のために何らかの方法で非表示にします。

別のアプローチ:

次のようなものを試すことで、「生」にすることができます。

 System.Net.WebClient wc = new System.Net.WebClient();

  System.IO.StreamReader webReader = new System.IO.StreamReader(
         wc.OpenRead("http://your_website.com"));

  string webPageData = webReader.ReadToEnd();

...次に、必要なものについて RegEx または webPageData を解析します。それとも、実際に実行するためにページ内の jscript が必要ですか? (これは .NET 4.0 で可能なはずです)

于 2010-04-30T20:23:34.537 に答える
2

この問題が発生しましたが、InternetExplorerをアンインストールしたことに気づきませんでした。WebBrowserコントロールはIEをインスタンス化するだけなので、持っている場合は何も起こりません。

于 2012-11-13T16:53:57.927 に答える
0

Webbrowserコントロールは、InternetExplorerの単なるラッパーです。

非表示のWindowsフォームウィンドウに設定して、完全にインスタンス化できます。

于 2010-04-30T20:27:53.193 に答える