2012-10-11 4 views
0

웹 응용 프로그램에서 WebBrowser 컨트롤을 사용합니다. DocumentCompleted 이벤트에서 내 문자열에 DocumentText를 원합니다. 내 DocumentCompleted 이벤트는 다음과 같습니다.웹 응용 프로그램의 WebBrowser 컨트롤 C#

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    string str = IEBrowser.DocumentText; 
} 

이제는 DocumentCompleted 이벤트에서 얻지 못하는 문제가있는 DocumentText입니다. DocumentCompleted 이벤트 후에 일을하는 자바 스크립트가 있다고 생각합니다. 그래서 저는 제 코드를 이렇게 바꿉니다.

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    Thread th = new Thread(new ThreadStart(startthread)); 
    th.Start();    
} 

public void startthread() 
{ 
    //To Wait untill WebBrowser run that javascript 
    Thread.Sleep(5000); 
    string str = IEBrowser.DocumentText; 
} 

이제이 코드를 사용하면 "지정된 캐스트가 유효하지 않습니다."라는 메시지가 나타납니다. WebBrowser가 실행중인 스레드를 기다리는 방법은 무엇입니까?

+1

웹 응용 프로그램에서 웹 탐색 제어를 사용합니까? 웹 응용 프로그램에서 무언가를 긁적니까? 더 좋은 방법은 httpwebrequest 또는 webclient를 사용하는 것입니다. – urlreader

답변

1

비록 이것이 좋은 방법이라고 생각하지는 않지만, 한 가지 방법은 DocumentComplete에서 처리하지 않는 것입니다. 같은 것을 할 :

  1. 당신이 시점에서 다음 ... 할 필요가 무엇이든, 브라우저, 다음 (당신이 구문을 확인해야 할 수 있습니다 내 헤더 밖으로 입력) URL로 이동해야합니다 :

      IEBrowser.Navigate(url); 
         bool flag = true; 
         int times = 0; 
         while (flag) 
         { 
          Sleep(500); 
          Application.DoEvent(); 
    
          if (IEBrowser.ReadyState == WebBrowserReadyState.Complete) 
          { 
           times ++; 
          } 
          else 
          { 
           times = 0; 
          } 
    
          if (times >= 10) 
          { 
           flag = false; 
          } 
         } 
    
         string str = IEBrowser.DocumentText; 
    

는 다시, 이것은 당신이 시도 할 주변 단지 작품이다. 당신의 목적에 달려있다, 이것은 많이 향상시킬 수 있습니다. 그러나 나는 많은 긁기 작업을 위해 이것과 비슷한 절차를 사용했다. 페이지에 따라 documentComplete가 여러 번 실행될 수 있습니다.

행운을 낸다

+0

고마워, 정확히 내가 원하는 방식으로 작동합니다. 지금 코드를 만들었습니다. 내 코드를 마무리해야 추가적인 도움이 필요하다. 코드에 Sleep()을 넣습니다. 이것은 Thread.Sleep();과 동일합니다. 왜냐하면 그것이 Thread.Sleep()이라면 실행을 멈추게해서 포함시키지 않기 때문입니다. – Hiren

+0

나는 이것을 TimeCallback에 넣었을 것이다. 그런 식으로 간격을두고 검사하고, 여전히 멈출 수 있고, 주 스레드를 죽이지 않을 것이다. – emalamisura

0

나는 당신이 여기서 무엇을하고 있는지 확실히 모르겠다. 그러나 나는 그 스레드를 시작하는 것이 올바른 해결책이 아니라는 것을 확신 할 수있다.

... IEBrowser_DocumentCompleted 내 경험에서 몇 번을 호출해야하기 때문에이 당신을 위해 작동하는지

void IEBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {  
if (IEBrowser.ReadyState = WebBrowserReadyState.Complete)   
    { 
     //Do my stuff 
    } 
} 

확실하지 ...이 시도하지만 난 그것으로 과거에 성공을 거두었습니다

+0

당신 말이 맞아요, 나는 이것을 시도했지만 그것은 나를 위해 작동하지 않습니다. ReadyState Complete 완료 후 javascript가 실행된다고 생각합니다. – Hiren

+0

TimerCallback을 사용하여 5 초 동안 기다리려고하지만, 그 결정적이지 않은 방법으로 모든 종류의 생산 솔루션에 의존하지 않을 것입니다. 또한 페이지에 스크립트를 삽입 할 수 있으며 이것을 사용하여 대기중인 자바 스크립트가 완료되었는지 여부를 확인할 수 있습니다. 여기에 스크립트 삽입에 대한 자세한 내용이 나와 있습니다. http :// /stackoverflow.com/questions/153748/how-to-inject-javascript-in-webbrowser-control – emalamisura

관련 문제