2017-11-04 3 views
0

웹 사이트로 이동하는 Windows Form에 WebBrowser 컨트롤이 있습니다. WebBrowser1.DocumentCompleted 이벤트는 5 번 발생하지만 나중에 실행되는 일부 스크립트가 있습니다. 페이지가 완전히로드되었다고 생각하기 전에 특정 요소가 나타날 때까지 기다려야합니다. 나는이 시도 :HtmlElement가 .NET의 WebBrowser에 나타날 때까지 기다리는 방법

While WebBrowser1.Document.GetElementById("username") Is Nothing 
    Application.DoEvents() 
End While 

을하지만이 페이지의 스크립트를 (페이지 심지어 오프라인 알려줍니다) 얼음장처럼 보인다. 도움을 받으려면 VB 나 C# 중 하나에서 답을 나에게 줄 수 있습니다.

EDIT : 저는 엘리먼트가 나타나면 타이머를 사용하여 매 100ms를 확인하는 방법을 사용하고 있습니다.

+1

이 코드를 실행하는 페이지로드 중입니까? –

+0

@YogeshHShenoy 나는 카운터가 있는데 WebBrowser1.DocumentCompleted에서이 코드를 실행한다. 다섯 번째로 발동한다. – paulolol

답변

2

Application.DoEvents()를 사용 (거의) 모든 솔루션은 나쁜 솔루션 것을 참고. DoEvents()은 사용자 인터페이스를 응답 성있게 유지하는 데 사용하면 안됩니다. 당신이 그것을 사용해야 할 필요가 있다고 느낀다면, 당신은 가장 틀린 일을하고있을 가능성이 큽니다. 참조 : Keeping your UI responsive and the Dangers of Application.DoEvents.

대신 DocumentCompleted 안에 WebBrowser.ReadyState property을 확인하십시오. 웹 페이지가 완전히로드되었는지 여부를 알려줍니다 (아니요,은 비동기식/지연된 자바 스크립트 코드를 고려합니다).

Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted 
    If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then 
     'Do stuff. 
    End If 
End Sub 
+0

Ok. 그래서 'ReadyState'가 완료된 직후에 요소가 나타나기 때문에 스크립트가 지연된다고 생각한다. MessageBox를 'Do stuff'뒤에 넣으면 "Ok"를 클릭 한 직후에 나타납니다). 그래서 지금은 Timer 메서드를 유지할 것입니다. – paulolol

+0

@paulolol : 예, 웹 페이지가 동적으로 변경 될 수 있기 때문에 더 좋은 방법은 없습니다. 이와 같은 상황에서도 타이머를 사용하고, DocumentCompleted 이벤트 핸들러를 시작하고 요소가 발견 될 때마다 타이머를 중지합니다. 'Windows.Forms.Timer'는 창 메시지를 기반으로하는 낮은 우선 순위 타이머이며 ~ 50ms의 최소 해상도를가집니다. 이와 같이 몇 초 동안 만 실행하는 상황에서는 성능에 실제로 영향을 미치지 않습니다. –

+0

그래, 그래도 도와 ​​줘서 고마워. :) – paulolol