web-dev-qa-db-fra.com

Contrôle WebBrowser C # - Obtenir les éléments de document après AJAX?

J'écris une application qui utilise le contrôle WebBrowser pour afficher le contenu Web susceptible de changer avec AJAX qui ajoute un nouveau contenu/des éléments. Je n'arrive pas à comprendre les nouveaux éléments de la manière que j'ai essayée. BrowserCtl.DocumentText n'a pas la page à jour et, bien sûr, il n'est pas non plus dans "Voir la source".

Existe-t-il un moyen d'obtenir ces nouvelles données à l'aide de ce contrôle? :( S'il vous plaît aider. Merci!

C'EST À DIRE:

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

J'ai résolu le problème pour moi.

la clé consiste à attacher un gestionnaire pour l'événement onPropertyChanged de l'élément div en cours de remplissage via un appel ajax.

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

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

et enfin,

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
Evren Yortucboylu
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

Vous devrez utiliser DOM pour cela. Transformez WebBrowser.Document.DomDocument en IHTMLDocument?. Vous devrez importer des interfaces COM ou un assemblage Microsoft.mshtml.

Consultez http://msdn.Microsoft.com/en-us/library/aa752641(VS.85).aspx pour plus de détails.

3
Eugene Petrenko

Je suppose que puisque vous lisez du contenu généré à partir de requêtes Ajax, vous demandez à l'utilisateur de faire progresser l'application jusqu'à un point où les données pertinentes sont chargées, puis vous exécutez du code pour lire les données. 

Si ce n'est pas le cas, vous devrez automatiser ce processus en générant les événements de clic qui construisent les nœuds DOM que vous souhaitez lire. Je le fais assez souvent avec le contrôle WebBrowser et j'ai tendance à écrire cette couche de fonctionnalités en Javascript et à l'appeler avec .InvokeScript (). Une autre route serait de trouver les nœuds qui déclenchent la fonctionnalité Ajax à partir de C # et déclenchent manuellement leurs événements de clic:

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

Un aspect important à noter dans le script ci-dessus est le fait que vous pouvez interagir naïvement avec les nœuds DOM en C # si vous acceptez et contournez les limites du type d'objet HtmlElement. 

2
John Lewin

Pourquoi ne pas utiliser javascript pour sous-titrer l'élément et l'afficher dans une nouvelle fenêtre? 

Je ne l'ai pas testé mais ça peut marcher.

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

Le vrai attribut pour ouvrir la déclaration dans une nouvelle fenêtre. (Ou un cadre ou peut-être que vous pouvez trouver un meilleur moyen)

Pour capturer l'événement NewWindow, vous devez référencer le fichier SHDocVw.dll qui se trouve dans votre dossier Windows/System32. Ensuite, vous pouvez lancer votre contrôle WebBrowser comme suit:

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

Vous pouvez le fermer tout de suite après avoir enregistré la réponse. Eh bien, bonne chance et laissez-moi savoir comment ça se passe.

0
Proximo

Les informations ne figurent-elles pas dans WebBrowser.DocumentText? http://msdn.Microsoft.com/en-us/library/system.windows.forms.webbrowser.documenttext.aspx

0
Fraser