Я пытаюсь программно загрузить веб-страницу через управление WebBrowser с намерением тестирования страницы, и это - функции JavaScript. В основном я хочу выдержать сравнение, HTML & JavaScript пробегает это управление против известного вывода, чтобы установить, существует ли проблема.
Однако я испытываю затруднения, просто создающие и перемещающиеся по управлению WebBrowser. Код ниже предназначается для загрузки HtmlDocument в WebBrowser. Свойство Document:
WebBrowser wb = new WebBrowser();
wb.AllowNavigation = true;
wb.Navigate("http://www.google.com/");
Когда исследование состояния веб-браузера через Intellisense после Перемещается () по выполнениям, WebBrowser. ReadyState является 'Неинициализированным', WebBrowser. Документ = пустой указатель, и это в целом кажется абсолютно незатронутым моим вызовом.
На контекстной ноте я выполняю это управление за пределами объекта формы Windows: Я не должен загружать окно или на самом деле смотреть на страницу. Требования диктуют потребность просто выполнить JavaScript страницы и исследовать результирующий HTML.
Любые предложения значительно ценятся, Спасибо!
Вы должны обработать событие 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
}
}
Edit: Вот простая версия кода, который запускает окно из консольного приложения. Конечно, вы можете пойти дальше и передать события в консольный код и т.д.
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");
}
}
}
Вероятно, вам нужно разместить элемент управления в родительском окне. Вы можете сделать это без нарушения требований, просто не показывая окно, в котором расположен элемент управления браузера, переместив его за пределы экрана. Это также может быть полезно для разработки, чтобы "видеть", что это действительно загружает что-то для тестирования, проверки и т.д.
Итак, попробуйте:
// in a form's Load handler:
WebBrowser wb = new WebBrowser();
this.Controls.Add(wb);
wb.AllowNavigation = true;
wb.Navigate("http://www.google.com/");
Также проверьте, какие еще свойства установлены для объекта WebBrowser, когда вы инстанцируете его через IDE. Например, создайте форму, поместите на нее элемент управления браузера и затем проверьте файл дизайнера формы, чтобы увидеть, какой код генерируется. Возможно, вам не хватает какого-то ключевого свойства, которое необходимо установить. Таким образом я обнаружил множество упущений в своем коде, а также узнал, как правильно программно инстанцировать визуальные объекты.
P.S. Если вы используете окно хоста, оно должно быть видно только во время разработки. Для производства вы будете скрывать его каким-либо образом.
Другой подход:
Вы можете пойти "сырым" путем, попробовав что-то вроде этого:
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)
Элемент управления Webbrowser - это просто оболочка для Internet Explorer.
Вы можете установить невидимое окно Windows Forms, чтобы полностью создать его экземпляр.