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

С# Управление WebBrowser - Получить элементы документа после AJAX?

Я пишу приложение, которое использует элемент управления 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 :(
4b9b3361

Ответ 1

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

ключ, прикрепляющий обработчик для события 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
}

Ответ 2

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

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

Посмотрите http://msdn.microsoft.com/en-us/library/aa752641(VS.85).aspx для более подробной информации.

Ответ 4

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

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

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

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

Ответ 5

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

Я не тестировал его, но он может работать.

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

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

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

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

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