WebBrowser 전체 페이지 로딩 감지
System.Windows.Forms.WebBrowser 컨트롤이로드를 완료했는지 어떻게 알 수 있습니까?
Navigate 및 DocumentCompleted 이벤트를 사용하려고했지만 둘 다 문서로드 중에 몇 번 발생했습니다!
DocumentCompleted
로드되는 모든 하위 문서 (예 : JS 및 CSS)에 대해서도 이벤트가 시작될 것이라고 생각합니다 . WebBrowserDocumentCompletedEventArgs
in을 보고 DocumentCompleted
Url 속성을 확인하고 기본 페이지의 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.Forms
는 DocumentCompleted
이벤트는 올바른 것이어야한다. 로드중인 페이지에 프레임이있는 경우 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
'program tip' 카테고리의 다른 글
* ngFor에서 동적 ID를 설정하는 방법은 무엇입니까? (0) | 2020.12.30 |
---|---|
내 onItemSelectedListener가 ListView에서 호출되지 않는 이유는 무엇입니까? (0) | 2020.12.30 |
Sun / Oracle JVM의 기본 XSS 값은 어디에서 찾을 수 있습니까? (0) | 2020.12.30 |
asp.net mvc 4에서 datetime 형식 지정 (0) | 2020.12.30 |
클래스 대신 인터페이스에서 객체 인스턴스를 만드는 이유는 무엇입니까? (0) | 2020.12.30 |