2009-03-11 12 views
20

Sto scrivendo un'applicazione che utilizza il controllo WebBrowser per visualizzare il contenuto Web che può cambiare con AJAX che aggiunge nuovi contenuti/elementi. Non riesco ad arrivare ai nuovi elementi in nessun modo che ho provato. BrowserCtl.DocumentText non ha la pagina aggiornata e ovviamente non è nemmeno in "visualizza sorgente".Controllo C# WebBrowser - Ottieni elementi documento dopo AJAX?

C'è un modo per ottenere questi nuovi dati utilizzando questo controllo? :( Aiutateci Grazie

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

risposta

-1

si fa a controllare la pagina web

Se è così, ecco un post sul blog che spiega come: http://www.palladiumconsulting.com/blog/sebastian/2007/04/ultimate-intranet-toy.html

Se no, probabilmente c'è una soluzione ma non posso aiutarti, mi dispiace

+0

purtroppo non controllano il JavaScript ... ma grazie. – aikeru

+0

http://web.archive.org/web/20071009143308/http://www.palladiumconsulting.com/blog/sebastian/2007/04/ultimate-intranet-toy.html – Chloraphil

3

Avrai bisogno di usare DOM per questo. ast WebBrowser.Document.DomDocument in IHTMLDocument ?. Dovrai importare alcune interfacce COM o Microsoft.mshtml.

Dai un'occhiata a http://msdn.microsoft.com/en-us/library/aa752641(VS.85).aspx per ulteriori dettagli.

+0

Ouch! Vorrei evitare questo, se possibile, penso. Sto lavorando bene con i tipi di HtmlElement.DomElement COM, ma l'IHTMLDocument avrebbe gli elementi modificati ora post-javascript? – aikeru

+0

Sto provando a farlo anche tu, hai mai trovato una soluzione? – TheGateKeeper

2

Presumo che dal momento che stai leggendo il contenuto generato dalle richieste Ajax, richiedi all'utente di far avanzare l'applicazione in un punto in cui vengono caricati i dati rilevanti, a quel punto si esegue il codice per leggere i dati.

Se questo non è il caso, è necessario automatizzare questo processo, generando gli eventi di clic che costruiscono i nodi DOM che si desidera leggere. Lo faccio piuttosto comunemente con il controllo WebBrowser e tendo a scrivere quel livello di funzionalità in Javascript e chiamarlo con .InvokeScript(). Un altro itinerario sarebbe di trovare i nodi che sparano la funzionalità Ajax da C# e manualmente innescare i loro eventi click:

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

Un aspetto importante da notare nello script sopra è il fatto che è possibile interagire con DOM nodi ingenuamente in C# se si accettano e si aggirano le limitazioni del tipo di oggetto HtmlElement.

+0

Grazie per il post informativo, purtroppo il mio problema sta nel fatto che una volta che JavaScript è già stato eseguito, ci sono nuovi elementi nella pagina con cui ho bisogno di interagire o controllare un valore da ... Document.x non sembra avere questi nuovi elementi post-javascript :( – aikeru

+0

Il riferimento a .Document fornisce l'accesso dal vivo al DOM e gli elementi creati dopo il caricamento iniziale sono accessibili quanto quelli originali.Qualsiasi possibilità che gli elementi generati esistano in un frame? condividi la pagina che presenta il problema? –

0

Che ne dici di eseguire javascript per didascalizzare l'elemento e visualizzarlo in una nuova finestra?

Non l'ho provato ma potrebbe funzionare.

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

L'attributo true per aprire il ritorno in una nuova finestra. (Oppure una cornice o forse puoi trovare un modo migliore)

Per catturare l'evento NewWindow dovrai fare riferimento allo SHDocVw.dll che si trova nella cartella Windows/System32. Poi si può lanciare la vostra controllo WebBrowser in questo modo:

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

Si può avere chiudere subito dopo aver memorizzato la risposta. Buona fortuna e fammi sapere come va.

5
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);   
     } 
    } 
} 
+0

Bella soluzione, ho provato solo per divertimento e per ** cose semplici **, questo sembra abbastanza bello – Hugo

+2

Questo ha continuato a restituire il vecchio html. Ho cercato in .Net 4.0 –

16

ho risolto il problema per me.

la chiave è, allegando un gestore per l'evento onPropertyChanged dell'elemento div che viene popolato tramite una chiamata ajax.

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

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

e, infine,

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 
} 
+0

ciao sono stato cercando di farlo con i commenti di YouTube, ma non riesco a capire come funzionerà. – Alok

Problemi correlati