2017-02-27 39 views
9

我需要在頁面上執行javascript後訪問HTML文檔的DOM。我有下面的代碼連接到URL並獲取文檔。 的問題是,它從來沒有得到過DOM修改使用javascript後使用WebBrowser訪問DOM

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(); 
    } 


} 

The DOM from google chrome developer tool

The DOM I get in my code

我希望有人能幫助我解決這個問題

+0

請不要將代碼作爲圖像發佈。以文本形式發佈代碼。此外,您應該使用事件來查找導航何時完成,而不是使用Application.DoEvents()或Thread.Sleep()的'while循環。 –

+0

我添加了代碼作爲文本,圖像來澄清瀏覽器中的dom和我得到的東西之間的區別 –

+0

如何使用替代控件?例如。 http://stackoverflow.com/questions/790542/replacing-net-webbrowser-control-with-a-better-browser-like-chrome – user1946932

回答

1

檢查網頁的呈現方式在IE7中。我猜你缺少的標籤是用jQuery添加的,而且頁面上的jQuery版本2.2.4不支持IE7。我認爲WebBrowser類會繞過IE7,即使您的PC上有更新版本的IE。

如果您擁有該頁面,請嘗試添加jQuery遷移插件。

+0

不確定以下內容是否有幫助?:https://www.cyotek.com/blog/configuring-the-emulation-mode-of-an -internet-explorer-webbrowser-control,https://blogs.msdn.microsoft.com/patricka/2015/01/12/controlling-webbrowser-control-compatibility/,https://weblog.west-wind。com/posts/2011/may/21/web-browser-control-specify-the-ie-version和http://stackoverflow.com/questions/17922308/use-latest-version-of-internet-explorer-in-該網頁瀏覽器控制 – user1946932

+0

該頁面在IE7中正確呈現,我將jQuery更改爲1.7.1,但沒有任何更改。 –

+0

我注意到上面黑色屏幕截圖中的div類名不是雙引號,如果這意味着什麼,images2.jpg URL也不是。我讀到XHTML需要引號。 – user1946932

3

如您所說,如果客戶端腳本確實在IE7中執行,則問題可能是純粹的時間。即使在文檔的加載完成之後,您仍然無法確切地知道何時會執行JS腳本。在嘗試達到documentElement之前等待5秒聽起來像是一個理論上的好主意;在實踐中,元素可能在此之前就存在。或者,也許網絡速度很慢,僅僅抓取jQuery腳本需要5秒鐘。

我建議測試您正在尋找的元素(img標記,視情況而定)的存在。東西沿線

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

這樣,你不需要Thread.Sleep線。

+0

該腳本將用於從任何給定的URL下載圖像,而不是特定的,我認爲這不適用於我的情況。 –

+0

怎麼回事?在我的回答中,我沒有考慮任何特定的網址。 – MrMister

+0

我正在尋找的是在執行任何ajax或客戶端腳本後獲取整個文檔dom。我不想在這裏尋找特定的元素,我想要下載任何給定的html頁面上的所有圖像,包括任何標籤的背景圖像,我已經完成了,除了我不能下載ajax請求加載的圖像或客戶端腳本。 –