.NET C#: элемент управления 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 имеет значение "Неинициализировано", WebBrowser.Document = null, и в целом мой вызов кажется совершенно незатронутым.
В контекстной заметке я запускаю этот элемент управления вне объекта формы Windows: мне не нужно загружать окно или фактически просматривать страницу. Требования диктуют необходимость просто выполнить JavaScript-код страницы и изучить полученный HTML-код.
Любые предложения с благодарностью, спасибо!
4 ответа
Вы должны обработать событие 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");
}
}
}
Возможно, вам нужно разместить элемент управления в родительском окне. Вы можете сделать это, не нарушая требований, просто не показывая окно, в котором находится элемент управления браузера, перемещая его за пределы экрана. Для разработки также может быть полезно "увидеть", что она действительно загружает что-то для тестирования, проверки и т. Д.
Так что постарайтесь:
// 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. Например, создайте форму, поместите на нее элемент управления браузера, а затем проверьте файл конструктора формы, чтобы увидеть, какой код сгенерирован. Возможно, вам не хватает некоторого ключевого свойства, которое необходимо установить. Таким образом, я обнаружил много пропусков в своем коде, а также научился правильно создавать экземпляры визуальных объектов программно.
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)
У меня была эта проблема, и я не понял, что я удалил Internet Explorer. Если у вас есть, ничего не произойдет, так как элемент управления WebBrowser только создает экземпляр IE.
Элемент управления Webbrowser - это просто оболочка для Internet Explorer.
Вы можете войти в невидимое окно Windows Forms, чтобы полностью создать его экземпляр.