2009-03-11 12 views
20

Piszę aplikację, która używa formantu WebBrowser do przeglądania treści WWW, która może się zmienić w AJAX, która dodaje nowe treści/elementy. Nie mogę wydawać się wchodzić w nowe elementy, tak jak próbowałem. BrowserCtl.DocumentText nie ma aktualnej strony i oczywiście nie znajduje się w "źródle widoku".C# Kontrola WebBrowser - Zdobądź elementy dokumentów po AJAX?

Czy istnieje sposób na uzyskanie tych nowych danych za pomocą tego kontrolki? :( Proszę o pomoc Dzięki

tj.!

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

Odpowiedz

-1

można kontrolować stronę internetową

Jeśli tak, oto blogu, który wyjaśnia, jak: http://www.palladiumconsulting.com/blog/sebastian/2007/04/ultimate-intranet-toy.html

If nie, prawdopodobnie istnieje rozwiązanie, ale nie mogę ci pomóc, przepraszam

+0

Niestety nie kontrolują JavaScript ... ale dzięki. – aikeru

+0

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

3

Będziesz musiał użyć DOM dla niego. ast WebBrowser.Document.DomDocument do IHTMLDocument ?. Będziesz musiał zaimportować niektóre interfejsy COM lub zestaw Microsoft.mshtml.

Aby uzyskać więcej informacji, zobacz numer http://msdn.microsoft.com/en-us/library/aa752641(VS.85).aspx.

+0

Ouch! Chciałbym tego uniknąć, jeśli to możliwe, jak sądzę. Działa dobrze z typami COM HtmlElement.DomElement, ale czy IHTMLDocument mają teraz zmienione elementy post-javascript? – aikeru

+0

Próbuję też to zrobić, czy kiedykolwiek znalazłeś rozwiązanie? – TheGateKeeper

2

Zakładam, że ponieważ czytasz treści generowane z żądań Ajax, które wymagają od użytkownika, aby rozwinąć aplikację do punktu, w którym są ładowane odpowiednie dane, w którym to momencie uruchamiasz kod w celu odczytania danych.

Jeśli tak nie jest, należy zautomatyzować ten proces, generując zdarzenia kliknięcia, które zbudują węzły DOM, które chcesz przeczytać. Robię to dość często za pomocą kontrolki WebBrowser i zazwyczaj piszę tę warstwę funkcjonalności w JavaScript i wywołuję ją za pomocą .InvokeScript(). Innym sposobem byłoby znaleźć węzły, które pożaru funkcjonalność Ajax z C# i ręcznie wyzwalać ich zdarzenia kliknij:

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

Ważnym aspektem zauważyć w skrypcie powyżej jest fakt, że można komunikować się z DOM węzłów naiwnie w C#, jeśli akceptujesz i pracujesz nad ograniczeniami typu obiektu HtmlElement.

+0

Dzięki za informacyjny post, niestety mój problem polega na tym, że skoro JavaScript już działa, na stronie są nowe elementy, z którymi muszę wchodzić w interakcje lub sprawdzać wartość od ... the Document.x nie wydaje się mają te nowe elementy post-javascript: ( – aikeru

+0

.Document reference zapewnia dostęp na żywo do DOM i elementy utworzone po początkowym załadowaniu są tak samo dostępne jak oryginalne. Czy istnieje szansa, że ​​wygenerowane elementy istnieją w ramce? udostępnić stronę, która przedstawia problem? –

0

Co powiesz na uruchomienie javascript do podpisania elementu i wyświetlania go w nowym oknie?

Nie testowałem tego, ale może działać.

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

Prawdziwy atrybut otwierania zwrotu w nowym oknie. (Lub ramka, a może znajdziesz lepszy sposób)

Aby przechwycić zdarzenie NewWindow, musisz odwołać się do pliku SHDocVw.dll, który znajduje się w folderze Windows/System32. Następnie możesz rzucić swoją Kontrolkę WebBrowser w ten sposób:

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

Możesz ją zamknąć zaraz po zapisaniu odpowiedzi. Powodzenia i daj mi znać, jak to działa.

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

Fajne rozwiązanie Próbowałem tylko dla zabawy i dla ** prostych rzeczy **, to wygląda całkiem nieźle – Hugo

+2

To kontynuuje rendering starego html. Próbowałem w .Net 4.0 –

16

Rozwiązałem problem dla mnie.

Kluczem jest dołączanie programu obsługi dla zdarzenia onPropertyChanged elementu div, który jest zapełniany przez wywołanie ajax.

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

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

wreszcie

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

cześć byłem próbując to zrobić z komentarzami na youtube, ale nie mogę zrozumieć, jak to zadziała. – Alok

Powiązane problemy