2011-09-07 19 views
14

Belirtilen web sayfasını getiren bir ASP.NET sayfası ve bazı özel sınıfları var ve bu sayfa gövdesini döndürüyor.WebBrowser denetiminde html (Javascript tarafından işlenir) nasıl işlenir?

protected String GetHtml() 
{ 
      Thread thread = new Thread(new ThreadStart(GetHtmlWorker)); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 
    thread.Join(); 
    return docHtml; 
} 

protected void GetHtmlWorker() 
{ 
    using (WebBrowser browser = new WebBrowser()) 
    { 

       browser.ScriptErrorsSuppressed = true; 
     browser.Navigate(_url); 

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

     docHtml = browser.DocumentText; 
    } 

Ama ne gerek -. I jQuery ile DOM üzerinde bazı ekstra işlemleri yapmak, çünkü yerine kaynak, DOM html olsun bu.

Yeri sınıf Form1 Form üzerinde webBrowser1 adında bir WebBrowser denetimi:

+1

Yani javascript modifiye ettikten sonra DOM html edilir gerekenler?Bunu bir ip gibi mi istiyorsun? –

cevap

15

İşte çalıştırıldı javascript sonra oluşturulan HTML (DOM) almak için bulduğu bir çözümdür.

[Form1.cs [Tasarım]] Sonra kod kullanımı için

:

[Form1.cs]

using System; 
using System.Runtime.InteropServices; 
using System.Windows.Forms; 

namespace WebBrowserTest 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.webBrowser1.ObjectForScripting = new MyScript(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      webBrowser1.Navigate("http://localhost:6489/Default.aspx"); 
     } 

     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      webBrowser1.Navigate("javascript: window.external.CallServerSideCode();"); 
     } 

     [ComVisible(true)] 
     public class MyScript 
     { 
      public void CallServerSideCode() 
      { 
       var doc = ((Form1)Application.OpenForms[0]).webBrowser1.Document; 
      } 
     } 
    } 
} 

Değişim WebBrowser1.Navigate (" http://localhost:6489/Default.aspx Form1_Load parametresindeki ") parametresi, DOM'ı almak istediğiniz javascript ile işlendikten sonra sayfaya çevirir.

doc.GetElementById("myDataTable"); 

Ya da bunun gibi render HTML erişebilirsiniz:

Örneğin, CallServerSideCode() yönteminde modifiye DOM erişebilir George gibi

var renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml; 
+0

bu harika bir cevap Răzvan Panda !!! Dinamik olarak sayfa oluştururken biraz soğuk füzyon okumak için kodunuzu kullandım ve şiirimi yeniden inşa etmeden önce işe yaradım. ŞİMDİ, gerçek işlenmiş verileri göremiyorum (iç/dış) html, gördüğümü geri döndüremiyor. Onu emekli için kullanabileceğim başka bir yer ya da yöntem var mı? – CocoaNewBee

+0

@CocoaNewBee: Başka bir yol bilmiyorum, araştırmayla bu şekilde erişmeyi öğrendim. Tarif ettiğin gibi, başka bir şekilde de elde edemezsin. –

+3

Neden webBrowser1_DocumentBunu yapmıyor webBrowser1.Document.GetElementsByTagName ("HTML") [0] .OuterHtml – George

4

birinde adı geçen yorumlarda, teorik olarak sadece DOM kullanarak webBrowser1_DocumentCompleted'i kullanarak aşağıdakileri kullanabilirsiniz:

+1

Bu işe yaramaz. –

2

Önce biraz arka plan. Bir web sayfasındaki bilgileri kazımaya çalışıyorum. Bu web sayfasının içeriği dinamiktir. Dinamik olarak ne demek istediğim, web sayfasının sayfanın altına doğru ilerledikçe daha fazla bilgi yüklemesidir. Sayfanın altına kaydırdığınızda HTML içeriği değişir. Ne yazık ki, Web Tarayıcı Nesnesi bu bilgiyi otomatik olarak güncellemez. Yine de, ilk olarak webbrowser.navigate işleviyle yüklendiği özgün belgeye sahip. Güncelleştirilmiş bilgi HTMLElementCollection için kullanılabilir.

Aşağıdaki kod benim için çalışmadı.

Dim eCollections As HtmlElementCollection 
    Dim strDoc As String 
    eCollections = WB.Document.GetElementsByTagName("HTML") 
    strDoc = eCollections(0).OuterHtml 

bir cazibe gibi çalıştı şöyle

webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml 

Yukarıdaki bildirimi dağıldı. Umarım bu da birine yardım eder.

+0

Teşekkürler. Bu bana yardımcı oldu. – user1422348

0

Biçimde bir zamanlayıcı ayarlamak için başka bir yöntem daha sonra zamanlayıcı vurduğunda, sayfa yeniden oluşturulacak ve sayfayı ayrıştırabilirsiniz.

-1

Sen WebBrowser1.Document.body.outerHTML

alabilirsiniz

İlgili konular