2010-07-13 26 views
8

Tôi đã nghiên cứu công cụ này và mọi người dường như đồng ý rằng giải pháp là kiểm tra ReadyState của Trình duyệt web cho đến khi được đặt thành Hoàn tất.WebBrowser DocumentCompleted event fired more once once

Nhưng thực tế sự kiện đôi khi được kích hoạt với số ReadyState được đặt thành Hoàn thành nhiều lần.

Tôi không nghĩ rằng có một giải pháp với NET WebBrowser crappy đó, nhưng có thể có một nếu tôi sử dụng thành phần DOM cơ bản.

Chỉ có vấn đề là, tôi không biết làm cách nào để truy cập thành phần DOM phía sau WebBrowser kích hoạt sự kiện DocumentCompleted.

Trả lời

33

DocumentCompleted sẽ kích hoạt cho mỗi khung trong trang web. Cách chăm chỉ là để đếm ra khỏi khung hình, cho bạn thấy làm thế nào để truy cập vào DOM:

private int mFrameCount; 

private void startNavigate(string url) { 
    mFrameCount = 0; 
    webBrowser1.Navigate(url); 
} 

private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { 
    mFrameCount += 1; 
    bool done = true; 
    if (webBrowser1.Document != null) { 
    HtmlWindow win = webBrowser1.Document.Window; 
    if (win.Frames.Count > mFrameCount && win.Frames.Count > 0) done = false; 
    } 
    if (done) { 
    Console.WriteLine("Now it is really done"); 
    } 
} 

cách dễ dàng là để kiểm tra địa chỉ URL đã hoàn thành tải:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    if (e.Url.Equals(webBrowser1.Url)) { 
     Console.WriteLine("Now it is really done"); 
    } 
} 
+0

Cách dễ dàng của câu trả lời này đã làm cho tôi. Mặc dù tôi đang sử dụng điều khiển axWebBrowser1. Tôi đã kết thúc bằng cách sử dụng sau đây. if (e.uRL.Equals (axWebBrowser1.LocationURL)) – IamBatman

+0

Tuyệt vời !! Cảm ơn nhiều – Grcn

0

Điều này có thể xảy ra nếu trang sử dụng Javascript hoặc <meta refresh> để chuyển hướng đến một trang khác.

Nếu vậy, không có cách giải quyết tốt.

0

tôi không thể tìm thấy bất cứ điều gì sẽ đảm bảo 100%. Ví dụ được đề cập (e.Url.Equals (webBrowser1.Url)) có thể hoạt động cho một WebBrowser.Navigate (url) đơn giản, tuy nhiên, trong trường hợp của tôi, tôi nhấp vào các nút trong mã để mở các khung mới trong khung hiện có. Chủ yếu là số lần "điều hướng" và "DocumentCompleted" lửa sẽ giống nhau, nhưng một lần nữa KHÔNG phải luôn luôn. "isBusy = false" và "ReadyState = Complete" sẽ luôn luôn là trường hợp khi nó hoàn thành (ít nhất là cho đến nay) nhưng nó cũng sẽ một vài lần có trạng thái này khi nó vẫn đang tải. Việc đếm các khung hình cũng có vẻ vô dụng đối với tôi, trong một trường hợp DocumentCompleted bị sa thải 23 lần, tuy nhiên, tất cả các khung và các khung phụ (-sub-sub và vân vân) là 14.

Điều duy nhất có vẻ hoạt động là chờ một khoảng thời gian ngắn (1 hoặc 2 giây?) Để xem liệu có bất kỳ điều gì xảy ra hay không (bất kỳ sự kiện nào được kích hoạt, bất kỳ thay đổi trạng thái nào).

Hmm, tôi tìm thấy một giải pháp khác cho tôi. Thông thường, chúng tôi không quan tâm đến toàn bộ trang đang được tải, thường chúng tôi muốn các phần tử nhất định tồn tại. Vì vậy, sau mỗi DocumentCompleted và khi "isBusy = false" và "ReadyState = Complete" chúng ta có thể tìm kiếm DOM nếu phần tử này tồn tại.