2017-02-27 30 views
9

Tôi cần truy cập DOM của tài liệu HTML sau khi thực hiện javascript trên trang. Tôi có mã dưới đây kết nối với URL và nhận tài liệu. Vấn đề là nó không bao giờ có được DOM sau khi sửa đổi với javascriptTruy cập DOM bằng WebBrowser

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

Tôi hy vọng rằng ai đó có thể giúp tôi với vấn đề này

+0

Vui lòng không đăng mã dưới dạng hình ảnh. Đăng mã dưới dạng văn bản. Ngoài ra, bạn nên sử dụng các sự kiện để tìm thấy khi điều hướng hoàn thành, không phải là một vòng lặp 'while' với' Application.DoEvents() 'hoặc' Thread.Sleep() '. –

+0

Tôi đã thêm mã dưới dạng văn bản, hình ảnh để làm rõ sự khác biệt giữa trình duyệt trong trình duyệt và những gì tôi nhận được –

+0

Làm cách nào để sử dụng một điều khiển thay thế? Ví dụ. http://stackoverflow.com/questions/790542/replacing-net-webbrowser-control-with-a-better-browser-like-chrome – user1946932

Trả lời

1

Kiểm tra như thế nào trang này hiển thị trong IE7. Tôi đoán thẻ bạn đang thiếu được thêm vào với jQuery và phiên bản jQuery 2.2.4 trên trang không hỗ trợ IE7. Tôi nghĩ rằng lớp WebBrowser quấn quanh IE7, ngay cả khi bạn có phiên bản IE mới hơn trên PC của mình.

Nếu bạn sở hữu trang, hãy thử thêm plugin di chuyển jQuery.

+0

Bạn không chắc chắn liệu những điều sau đây có hữu ích không ?: 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-specifying-the-ie-phiên bản và http://stackoverflow.com/questions/17922308/use-latest-version-of-internet-explorer-in- the-webbrowser-control – user1946932

+0

Trang được hiển thị chính xác trong IE7 và tôi đã thay đổi jQuery thành 1.7.1 nhưng không có gì thay đổi. –

+0

Tôi đã nhận thấy các tên lớp div trong ảnh chụp màn hình màu đen ở trên không có trong dấu ngoặc kép và URL images2.jpg không phải là nếu đó có nghĩa là bất cứ điều gì. Tôi đọc rằng XHTML yêu cầu báo giá. – user1946932

3

Nếu kịch bản phía máy khách thực sự đang thực thi trong IE7 như bạn nói, vấn đề có thể hoàn toàn là thời gian. Ngay cả sau khi tải xong tài liệu, bạn không thể biết chính xác khi các tập lệnh JS sẽ được thực thi. Đợi 5 giây trước khi cố gắng tiếp cận với âm thanh documentElement như một ý tưởng hay về lý thuyết; trong thực tế, phần tử có thể tồn tại trước đó. Hoặc, có lẽ mạng chậm và chỉ đơn thuần là lấy kịch bản jQuery mất 5 giây.

Tôi đề nghị kiểm tra sự tồn tại của phần tử bạn đang tìm kiếm (một thẻ img, như trường hợp có thể). Nội dung nào đó dọc theo dòng

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

Bằng cách này, bạn sẽ không cần dòng Thread.Sleep.

+0

Tập lệnh sẽ được sử dụng để tải xuống hình ảnh từ bất kỳ URL cụ thể nào, không phải là một URL cụ thể, tôi nghĩ điều này sẽ không hoạt động trong trường hợp của tôi. –

+0

Bằng cách nào? Tôi không liên quan đến bất kỳ URL cụ thể nào trong câu trả lời của tôi. – MrMister

+0

Những gì tôi đang tìm kiếm là lấy toàn bộ tài liệu sau khi thực hiện bất kỳ tập lệnh ajax hoặc phía máy khách nào. Tôi không tìm kiếm phần tử cụ thể ở đây, tôi muốn tải xuống tất cả hình ảnh trên bất kỳ trang html nào, bao gồm hình nền cho bất kỳ thẻ nào, tôi đã thực hiện với điều đó, ngoại trừ việc tôi không thể tải xuống hình ảnh được tải bởi yêu cầu ajax hoặc kịch bản phía máy khách. –

2

Tôi không thể nhìn thấy js được thực hiện ở đây nhưng tôi tưởng tượng bạn có thể tìm thấy chính xác những gì yếu tố đang được cập nhật và đính kèm một event handler để khi onprpertychange sự kiện như một giải pháp được đưa ra ở đây: C# WebBrowser control -- Get Document Elements After AJAX?

Nếu js là lật một phần tử theo lớp thay vì ý tưởng thì bạn có thể mượn logic từ đây: How to select a class by GetElementByClass and click on it programmically

Các vấn đề liên quan