program tip

WebBrowser 전체 페이지 로딩 감지

radiobox 2020. 12. 30. 08:02
반응형

WebBrowser 전체 페이지 로딩 감지


System.Windows.Forms.WebBrowser 컨트롤이로드를 완료했는지 어떻게 알 수 있습니까?

Navigate 및 DocumentCompleted 이벤트를 사용하려고했지만 둘 다 문서로드 중에 몇 번 발생했습니다!


DocumentCompleted로드되는 모든 하위 문서 (예 : JS 및 CSS)에 대해서도 이벤트가 시작될 것이라고 생각합니다 . WebBrowserDocumentCompletedEventArgsin을 보고 DocumentCompletedUrl 속성을 확인하고 기본 페이지의 Url과 비교할 수 있습니다.


다음을 수행했습니다.

void BrowserDocumentCompleted(object sender,
        WebBrowserDocumentCompletedEventArgs e)
{
  if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
    return; 

  //The page is finished loading 
}

로드 된 마지막 페이지는 탐색 된 페이지 인 경향이 있으므로 작동합니다.

에서 여기 .


다음이 작동합니다.

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    //Check if page is fully loaded or not
    if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
        return;
    else
        //Action to be taken on page loading completion
}

DocumentCompleted의 URL은 서버 전송 또는 URL 정규화로 인해 탐색 URL과 다를 수 있습니다 (예 : www.microsoft.com으로 이동하고 documentcomplete에서 http://www.microsoft.com 을 얻음 ).

프레임이없는 페이지에서이 이벤트는로드가 완료된 후 한 번 발생합니다. 여러 프레임이있는 페이지에서이 이벤트는 각 탐색 프레임에 대해 발생합니다 (프레임 내에서 탐색이 지원됩니다. 예를 들어 프레임에서 링크를 클릭하면 프레임을 다른 페이지로 탐색 할 수 있음). 최상위 수준 브라우저 일 수도 있고 아닐 수도있는 최상위 탐색 프레임은 최종 DocumentComplete 이벤트를 발생시킵니다.

네이티브 코드 에서 DocumentComplete 이벤트의 보낸 사람을 비교하여 이벤트가 탐색의 마지막 이벤트인지 여부를 확인합니다 . 그러나 Windows Forms에서 sender 매개 변수는 WebBrowserDocumentCompletedEventArgs에 의해 래핑되지 않습니다. 당신도 네이티브 이벤트를 싱크 매개 변수의 값을 얻기 위해, 또는 확인 브라우저의 readyState의 재산 또는 프레임 문서 의 모든 프레임이 준비 상태에 있는지 확인하기 위해 DocumentCompleted 이벤트 처리기를.

다운로드 관리자 가 있고 다운로드 가능한 파일에 대한 탐색 인 것처럼 readystate 메서드에 문제가 있습니다. 다운로드 관리자 가 탐색을 취소 할 수 있으며 readystate가 완료되지 않을 수 있습니다.


여러 DocumentCompleted해고 이벤트에 대해 동일한 문제가 있었고 위의 모든 제안을 시도했습니다. 마지막으로, 내 경우도 보인다 IsBusy속성이 바로도 작동 Url특성 만이 ReadyState이 상태 '대화'를 여러 프레임을로드하는 동안 가지고 있기 때문에, 내가 필요로했던 것 같다 그리고 마지막 하나를로드 한 후 상태가 '완료'를 얻는다 . 따라서 페이지가 모든 구성 요소로 완전히로드되는시기를 알고 있습니다.

나는 이것이 다른 사람들에게도 도움이되기를 바랍니다. :)


외부 Javascript 또는 CSS 파일에 대해서는 DocumentCompleted / Navigated 이벤트를 트리거하지 않는 것 같지만 iframe에 대해서는 트리거됩니다. PK가 말했듯이 WebBrowserDocumentCompletedEventArgs.Url 속성을 비교합니다 (아직 코멘트를 작성할 카르마가 없습니다).


WPF를 사용하는 LoadCompleted경우 이벤트가 있습니다.

그것의 경우 Windows.FormsDocumentCompleted이벤트는 올바른 것이어야한다. 로드중인 페이지에 프레임이있는 경우 WebBrowser컨트롤은 DocumentCompleted각 프레임에 대해 이벤트를 시작합니다 ( 자세한 내용 여기 참조). IsBusy이벤트가 발생할 때마다 속성을 확인하고 false이면 페이지가 완전히로드 된 것입니다.


여러 중첩 프레임이있는 페이지에서 DocumentCompleted 이벤트를 사용하는 것은 저에게 효과적이지 않았습니다.

Interop.SHDocVW 라이브러리를 사용하여 WebBrowser 컨트롤을 다음과 같이 캐스팅했습니다.

public class webControlWrapper
{
    private bool _complete;
    private WebBrowser _webBrowserControl;

    public webControlWrapper(WebBrowser webBrowserControl)
    {
        _webBrowserControl = webBrowserControl;
    }

    public void NavigateAndWaitForComplete(string url)
    {
        _complete = false;

        _webBrowserControl.Navigate(url);

        var webBrowser = (SHDocVw.WebBrowser) _webBrowserControl.ActiveXInstance;

        if (webBrowser != null)
            webBrowser.DocumentComplete += WebControl_DocumentComplete;

        //Wait until page is complete
        while (!_complete)
        {
            Application.DoEvents();
        }
    }

    private void WebControl_DocumentComplete(object pDisp, ref object URL)
    {
        // Test if it's the main frame who called the event.
        if (pDisp == _webBrowserControl.ActiveXInstance)
            _complete = true;
    }

이 코드는 webBrowserControl.Navigate (url) 메서드를 사용하여 정의 된 URL로 이동할 때 저에게 효과적이지만 htmlElement.InvokeMember ( "click")을 사용하여 html 단추를 클릭 할 때 페이지 완료를 제어하는 ​​방법을 모릅니다.


You can use the event ProgressChanged ; the last time it is raised will indicate that the document is fully rendered:

this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);

ReferenceURL : https://stackoverflow.com/questions/2777878/detect-webbrowser-complete-page-loading

반응형