web-dev-qa-db-ja.com

.NET C#:WebBrowserコントロールNavigate()がターゲットURLをロードしない

ページとその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は 'Uninitialized'、WebBrowser.Document = nullであり、全体としては私の呼び出しの影響を受けていません。

コンテキストノートでは、このコントロールをWindowsフォームオブジェクトの外部で実行しています。ウィンドウをロードしたり、実際にページを見たりする必要はありません。要件は、単にページのJavaScriptを実行し、結果のHTMLを調べる必要性を示します。

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

16
Dave

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");
    }
  }
}
17
Chris Taylor

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

だから試してください:

// 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オブジェクトに設定されている他のプロパティを確認します。例えば。フォームを作成し、その上にブラウザコントロールをドロップし、フォームのデザイナファイルをチェックして、生成されるコードを確認します。設定する必要のある重要なプロパティが不足している可能性があります。この方法でコードに多くの欠落があることを発見し、プログラムでビジュアルオブジェクトを適切にインスタンス化する方法も学びました。

追伸ホストウィンドウを使用する場合、開発中のみ表示されます。あなたは生産のために何らかの方法で隠れるでしょう。

別のアプローチ:

あなたはこのようなものを試して「生」に行くことができます:

 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で可能になるはずです)

3
Paul Sasik

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

2
Erik Bergstedt

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

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

0
Foxfire