Подтвердить что ты не робот

.NET С#: элемент управления WebBrowser Navigate() не загружает целевой URL

Я пытаюсь программно загрузить веб-страницу с помощью элемента управления WebBrowser с целью тестирования страницы и ее функций JavaScript. В принципе, я хочу сравнить HTML и JavaScript с помощью этого элемента управления с известным выходом, чтобы выяснить, есть ли проблема.

Однако мне сложно создавать и перемещать элемент управления WebBrowser. Код ниже предназначен для загрузки HtmlDocument в свойство WebBrowser.Document:

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

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

При проверке состояния веб-браузера через Intellisense после запуска Navigate() WebBrowser.ReadyState является "Uninitialized", WebBrowser.Document = null, и в целом он полностью не изменяется моим вызовом.

В контекстной заметке я запускаю этот элемент управления вне объекта формы Windows: мне не нужно загружать окно или на самом деле смотреть на страницу. Требования диктуют необходимость просто выполнить JavaScript страницы и проверить полученный HTML.

Любые предложения очень ценятся, спасибо!

4b9b3361

Ответ 1

Вы должны обработать событие WebBrowser.DocumentComplete, как только это событие будет поднято, у вас будет документ и т.д.

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 Forms и протестировал.

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

Ответ 2

Вероятно, вам необходимо разместить элемент управления в родительском окне. Вы можете сделать это без нарушения требований, просто не показывая окно, в котором размещается элемент управления браузера, перемещая его с экрана. Для разработки также может быть полезно "видеть", что он действительно загружает что-то для тестирования, проверки и т.д.

Итак, попробуйте:

// in a form Load handler:

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

Также проверьте, какие другие свойства установлены в объекте WebBrowser, когда вы создаете его через среду IDE. Например. создать форму, отбросить на нее элемент управления браузером, а затем проверить файл конструктора форм, чтобы узнать, какой код сгенерирован. Возможно, вам не хватает какого-либо ключевого свойства, которое необходимо установить. Я обнаружил много-упущение в своем коде таким образом, а также научился правильно создавать визуальные объекты программным путем.

P.S. Если вы используете окно хоста, оно должно быть видимым только во время разработки. Вы каким-то образом спрятались бы для производства.

Другой подход:

Вы можете пойти "raw", попробовав что-то вроде этого:

 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

У меня была эта проблема, и я не понимал, что удалил Internet Explorer. Если у вас есть, ничего никогда не произойдет, поскольку элемент управления WebBrowser создает экземпляр IE.

Ответ 4

Элемент управления Webbrowser - это всего лишь оболочка обозревателя Internet Explorer.

Вы можете установить его в невидимое окно Windows Forms, чтобы полностью создать его экземпляр.