it-swarm.com.de

C # WebBrowser-Steuerelement - Abrufen von Dokumentelementen nach AJAX?

Ich schreibe eine Anwendung, die das WebBrowser-Steuerelement verwendet, um Webinhalte anzuzeigen, die sich mit AJAX ändern können und die neue Inhalte/Elemente hinzufügen. Ich kann anscheinend nicht an die neuen Elemente herankommen, wie ich es versucht habe. BrowserCtl.DocumentText verfügt nicht über die aktuelle Seite und befindet sich natürlich auch nicht in "Quelltext anzeigen".

Gibt es eine Möglichkeit, diese neuen Daten mithilfe dieses Steuerelements abzurufen? :( Bitte helfen Sie. Danke!

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 :(
20
aikeru

Ich habe das Problem für mich gelöst.

der Schlüssel ist das Anhängen eines Handlers für das onPropertyChanged -Ereignis des div-Elements, das über einen Ajax-Aufruf gefüllt wird.

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

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

und schlussendlich,

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
}
17
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);           
        }
    }
}
5
xian

Sie müssen DOM dafür verwenden. Umwandeln von WebBrowser.Document.DomDocument in IHTMLDocument ?. Sie müssen einige COM-Schnittstellen oder Microsoft.mshtml-Assembly importieren.

Weitere Informationen finden Sie unter http://msdn.Microsoft.com/en-us/library/aa752641(VS.85).aspx .

3
Eugene Petrenko

Ich gehe davon aus, dass Sie, da Sie Inhalte lesen, die aus Ajax-Anforderungen generiert werden, den Benutzer dazu bringen müssen, die Anwendung bis zu einem Punkt fortzusetzen, an dem die relevanten Daten geladen sind, und an diesem Punkt Code zum Lesen der Daten ausführen. 

Ist dies nicht der Fall, müssen Sie diesen Prozess automatisieren und die Klickereignisse generieren, aus denen die DOM-Knoten bestehen, die Sie lesen möchten. Ich mache das ziemlich häufig mit dem WebBrowser-Steuerelement und neige dazu, diese Funktionalitätsebene in Javascript zu schreiben und sie mit .InvokeScript () aufzurufen. Eine andere Möglichkeit wäre, die Knoten zu finden, die die Ajax-Funktionalität aus C # auslösen, und deren Klickereignisse manuell auszulösen:

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

Ein wichtiger Aspekt im obigen Skript ist die Tatsache, dass Sie in C # naiv mit DOM-Knoten interagieren können, wenn Sie die Einschränkungen des HtmlElement-Objekttyps akzeptieren und umgehen. 

2
John Lewin

Wie wäre es, wenn Sie Javascript zum Beschreiben des Elements verwenden und es in einem neuen Fenster anzeigen? 

Ich habe es nicht getestet, aber es kann funktionieren.

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

Das true-Attribut, um die Rückgabe in einem neuen Fenster zu öffnen. (Oder einen Rahmen oder vielleicht findest du einen besseren Weg)

Um das NewWindow-Ereignis zu erfassen, müssen Sie auf die SHDocVw.dll verweisen, die sich in Ihrem Windows/System32-Ordner befindet. Dann können Sie Ihr WebBrowser-Steuerelement folgendermaßen umwandeln:

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

Sie können es nach dem Speichern der Antwort sofort schließen lassen. Nun viel Glück und lass mich wissen, wie es geht.

0
Proximo

Befinden sich die Informationen nicht im WebBrowser.DocumentText? http://msdn.Microsoft.com/de-de/library/system.windows.forms.webbrowser.documenttext.aspx

0
Fraser