Zugriff auf das DOM mit WebBrowser

Brauche ich Zugriff auf das DOM des HTML-Dokuments nach der Ausführung von javascript-Code auf der Seite. Ich habe den untenstehenden code die Verbindung zu der URL und ruft das Dokument.
Das problem ist, dass es nie den DOM nach modified mit javascript

public class CustomBrowser
{
    public CustomBrowser()
    {
        //
        //TODO: Add constructor logic here
        //
    }

    protected string _url;
    string html = "";
    WebBrowser browser;

    public string GetWebpage(string url)
    {
        _url = url;
        //WebBrowser is an ActiveX control that must be run in a
        //single-threaded apartment so create a thread to create the
        //control and generate the thumbnail
        Thread thread = new Thread(new ThreadStart(GetWebPageWorker));
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
        string s = html;
        return s;
    }

    protected void GetWebPageWorker()
    {
        browser = new WebBrowser();
        // browser.ClientSize = new Size(_width, _height);
        browser.ScrollBarsEnabled = false;
        browser.ScriptErrorsSuppressed = true;
        //browser.DocumentCompleted += browser_DocumentCompleted;
        browser.Navigate(_url);

        //Wait for control to load page
        while (browser.ReadyState != WebBrowserReadyState.Complete)
            Application.DoEvents();

        Thread.Sleep(5000);


        var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)browser.Document.DomDocument;

        html = documentAsIHtmlDocument3.documentElement.outerHTML; 


        browser.Dispose();
    }


}

Zugriff auf das DOM mit WebBrowser

Zugriff auf das DOM mit WebBrowser

Ich hoffe, dass mir jemand helfen kann mit diesem problem

  • Bitte keine post-code-Bilder. Post code als text. Auch solltest du dich über Ereignisse zu finden, wenn die navigation beendet ist, nicht ein while Schleife mit Application.DoEvents() oder Thread.Sleep().
  • Ich habe den code als text, die Bilder verdeutlichen den Unterschied zwischen den dom im browser und was bekomme ich
  • Wie wäre es mit eine alternative Steuerung? E. g. stackoverflow.com/questions/790542/…
  • Getestet habe ich den code mit idealtackle.com als url-parameter, es ist ein Bild, das ändert sich jedes mal die Seite geladen Trog javascript, und nach dem laden es zwei verschiedene Zeit gab es zwei verschiedene Bild geladen und es war keinerlei problem, wenn u wollen, zu sehen, dass Sie für sich selbst, legen Sie einen Haltepunkt auf browser -.Dispose(); dann schauen Sie auf html in die Schnellansicht in Zeile 121, BACKGROUND-IMAGE: ändert sich jedes mal, wenn Sie laden. ALSO meine Vermutung ist, es sollte sein, da Ihre browser-version oder Sicherheit für die Ausführung von javascript oder etwas ähnliches.
  • könnte u bitte geben Sie uns Ihre url, damit ich überprüfen Sie mit dass auch?
  • Hier ist der link autoindex-eg.com/test



3 Replies
  1. 3

    Wenn die client-side-script ist in der Tat die Ausführung im IE7, wie Sie sagen, die Frage könnte rein timing. Auch nachdem das Dokument laden abgeschlossen ist, können Sie nicht genau wissen wenn die JS-Skripte ausgeführt werden. Warten Sie 5 Sekunden, bevor Sie versuchen zu erreichen, für die documentElement klingt wie eine gute Idee in der Theorie; in der Praxis wird das element kann vorhanden sein, bevor, die. Oder vielleicht das Netzwerk langsam ist und nur fetching jQuery-Skript dauert 5 Sekunden auf seiner eigenen.

    Schlage ich vor, die testet, ob das element, das Sie suchen (einen img tag, wie der Fall sein kann). Etwas entlang der Linien von

    while (browser.Document.GetElementsByTagName("img").Count == 0) {
        Application.DoEvents();
    }

    Diese Weise, würden Sie nicht brauchen, die Thread.Sleep Linie.

    • Das Skript wird verwendet für das herunterladen von Bildern von einer angegebenen URL nicht ein spezifisches ein, ich denke, das wird nicht funktionieren in meinem Fall.
    • Wie kommt das? Ich habe nicht im Zusammenhang mit einem bestimmten URL in meiner Antwort.
    • Was ich Suche ist versuchen Sie, das gesamte Dokument-dom nach jedem ajax-oder client-seitige scripts Ausführung. Ich bin nicht auf der Suche nach bestimmten element hier, ich will download alle Bilder, die auf jede gegebene html-Seite einschließlich der hintergrund-Bilder für jeden tag, den ich bereits getan, außer, dass ich kann nicht laden Sie die Bilder laden durch ajax-request oder durch client-seitiges script.
  2. 2

    Kann ich nicht sehen, das js ausgeführt wird hier, aber ich glaube, Sie können genau das finden, was element wird aktualisiert, und fügen Sie Einen Ereignis-handler zu, wenn onprpertychange Ereignis wie eine Lösung, die ist hier gegeben:
    C# WebBrowser-Steuerelement — Get-Dokument-Elemente Nach AJAX?

    Wenn js ist flipping eine element-Klasse anstelle der Idee, dann könnte man ausleihen Logik von hier:
    So wählen Sie eine Klasse, die von GetElementByClass und klicken Sie auf es programmically

  3. 1

    Überprüfen, wie die Seite angezeigt wird, im IE7. Ich denke, der tag, die Ihnen fehlt, wird Hinzugefügt, mit jQuery und der jQuery-version 2.2.4 auf der Seite nicht unterstützt IE7. Ich denke, dass die WebBrowser-Klasse unterstützt wrap-around-IE7, auch wenn Sie eine neuere version des IE auf Ihrem PC.

    Wenn Sie Besitzer der Seite sind, versuchen Sie, das jQuery migrate plugin.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.