Элемент управления C # WebBrowser - получить элементы документа после AJAX? - PullRequest
20 голосов
/ 11 марта 2009

Я пишу приложение, которое использует элемент управления WebBrowser для просмотра веб-контента, который может измениться с AJAX, который добавляет новый контент / элементы. Кажется, я не могу понять новые элементы так, как я пытался. BrowserCtl.DocumentText не имеет обновленной страницы и, конечно, он также не находится в «источнике просмотра».

Есть ли способ получить эти новые данные с помощью этого элемента управления? :( Пожалуйста помоги. Спасибо!

IE:

Browser.Navigate("www.somewebpagewithAJAX.com");
//Code that waits for browser to finish...
...
//WebBrowser control has loaded content and AJAX has loaded new content
// (is visible at runtime on form) but can't see them in Browser.Document.All
// or Browser.DocumentText :(

Ответы [ 7 ]

17 голосов
/ 19 декабря 2012

Я решил проблему для себя.

ключ в том, чтобы прикрепить обработчик для события onPropertyChanged элемента div, который заполняется с помощью вызова ajax.

HtmlElement target = webBrowser.Document.GetElementById("div_populated_by_ajax");

if (target != null)
{
      target.AttachEventHandler("onpropertychange", handler);
}

и, наконец,

private void handler(Object sender, EventArgs e)
{
      HtmlElement div = webBrowser.Document.GetElementById("div_populated_by_ajax");
      if (div == null) return;
      String contentLoaded = div.InnerHtml; // get the content loaded via ajax
}
5 голосов
/ 29 марта 2010
using System;
using System.Windows.Forms;

namespace WebBrowserDemo
{
    class Program
    {
        public const string TestUrl = "http://www.w3schools.com/Ajax/tryit_view.asp?filename=tryajax_first";

        [STAThread]
        static void Main(string[] args)
        {
            WebBrowser wb = new WebBrowser();
            wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
            wb.Navigate(TestUrl);

            while (wb.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
            }

            Console.WriteLine("\nPress any key to continue...");
            Console.ReadKey(true);
        }

        static void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            WebBrowser wb = (WebBrowser)sender;

            HtmlElement document = wb.Document.GetElementsByTagName("html")[0];
            HtmlElement button = wb.Document.GetElementsByTagName("button")[0];

            Console.WriteLine(document.OuterHtml + "\n");

            button.InvokeMember("Click");

            Console.WriteLine(document.OuterHtml);           
        }
    }
}
3 голосов
/ 28 марта 2009

Вам нужно будет использовать DOM для этого. Привести WebBrowser.Document.DomDocument к IHTMLDocument ?. Вам придется импортировать некоторые COM-интерфейсы или сборку Microsoft.mshtml.

Подробнее см. http://msdn.microsoft.com/en-us/library/aa752641(VS.85).aspx.

2 голосов
/ 30 марта 2009

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

Если это не так, вам нужно автоматизировать этот процесс, генерируя события щелчка, которые формируют DOM-узлы, которые вы хотите прочитать. Я делаю это довольно часто с помощью элемента управления WebBrowser и, как правило, пишу этот уровень функциональности в Javascript и вызываю его с помощью .InvokeScript (). Другим способом было бы найти узлы, которые запускают функциональность Ajax из C # и вручную вызвать их события щелчка:

HtmlElement content = webMain.Document.GetElementById("content");
content.RaiseEvent("onclick");

Важным аспектом, который следует отметить в приведенном выше сценарии, является тот факт, что вы можете наивно взаимодействовать с DOM-узлами в C #, если вы принимаете ограничения на тип объекта HtmlElement и работаете с ними.

0 голосов
/ 18 августа 2009

Информация не находится в WebBrowser.DocumentText? http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.documenttext.aspx

0 голосов
/ 26 июня 2009

Как насчет запуска javascript для подписи элемента и отображения его в новом окне?

Я не проверял, но это может сработать.

(WebBrowser)w.Navigate("javascript:GetElementById('div').innerHtml;", true);

Атрибут true для открытия возврата в новых окнах. (Или рама или, может быть, вы можете найти лучший способ)

Для захвата события NewWindow вам нужно обратиться к SHDocVw.dll, который находится в вашей папке Windows / System32. Затем вы можете разыграть свой элемент управления WebBrowser следующим образом:

SHDocVw.WebBrowser_V1 browser = (SHDocVw.WebBrowser_V1)(WebBrowser)w.ActiveXInstance;

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

0 голосов
/ 13 марта 2009

Вы контролируете веб-страницу?

Если это так, вот сообщение в блоге, которое объясняет, как: http://www.palladiumconsulting.com/blog/sebastian/2007/04/ultimate-intranet-toy.html

Если нет, возможно, есть решение, но я не могу вам помочь, извините.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...