2014-01-13 4 views
2

StackOverflow에서이 항목과 관련된 몇 가지 스레드를 보았지만 그 중 아무 것도 대답을 제공하지 않는 것 같습니다.C# WPF - 페이지가로드되기를 기다리는 중

버튼을 클릭하면 보이지 않는 웹 페이지가 열리 며 URL로 이동하고 상자에 정보를 입력하고 버튼을 누른 다음 정보를 얻기 위해 화면을 긁습니다. 기본적 클릭으로 내 코드의

뼈 :

WebBrowser wb = new WebBrowser; 
wb.Visibility = System.Windows.Visibility.Hidden; 
wb.Navigate("http://somepage.com"); 

그리고 그것은 까다로운 얻는 곳입니다.

을 찾으려면 페이지가 데이터를 입력하거나 화면을 긁기 전에로드되는지 확인하십시오. Navigated, IsLoaded, LoadCompletedBackgroundWork에 관한 몇 가지 스레드를 보았지만 작동하지 않습니다.

페이지가 완전히로드되었는지 확인하는 데 가장 좋은 옵션은 무엇입니까? 선택한 방법을 어떻게 활용 하시겠습니까?

또한 WPF는 동일한 GetElementByID을 사용하지 않으므로 화면에서 데이터를 가져올 수 없습니다.

편집 : 아래의 코멘트 당

, 나는 여기에 실행 오류입니다 :

  • 탐색 첫째 즉시 페이지가 너무 탐색되었으며, 반드시 모든 객체 때까지 기다려야하지 않는 한을 로드됩니다. 이것은 의도 한대로 작동하지만 내 용도로는 사용할 수 없습니다.
  • IsLoaded 결코

private void GetData_Click(object sender, RoutedEventArgs e) 
{ 
    int x=0; 
    HTMLDocument doc; 

    wb = new WebBrowser(); 
    wb.Visibility = System.Windows.Visibility.Visible; 
    wb.Navigate("somesite.com"); 

    doc = wb.Document as mshtml.HTMLDocument; 

    while(!wb.IsLoaded) 
    { 
    //Wait 
    } 

    doc.getElementById("txt_One").innerText = "It Worked"; 

} 

사실 이제까지로드하지 않는 것 wb로 무한 루프에 넣 반환하지 않습니다.
  • 는 LoadCompleted와 버전
'System.Windows.Controls.WebBrowser.LoadCompleted'에서만 이벤트 + = 또는 좌측에 표시 될 수

- =

private void GetData_Click(object sender, RoutedEventArgs e) 
    { 
     int x=0; 
     HTMLDocument doc; 

     wb = new WebBrowser(); 
     wb.Visibility = System.Windows.Visibility.Visible; 
     wb.Navigate("somesite.com"); 

     doc = wb.Document as mshtml.HTMLDocument; 

     wb.LoadCompleted += wb_LoadCompleted; 

     doc.getElementById("txt_One").innerText = "It Worked"; 

    } 

    void wb_LoadCompleted(object sender, NavigationEventArgs e) 
    { 

    } 

오류를 생성

{filename}에서 처리되지 않은 예외 'System.NullReferenceException'이 발생했습니다.

추가 정보 : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.

+2

"작동하지 못함"에 대해 자세히 설명하십시오. 코드를 보여주고, 각 시도의 문제점을 훨씬 자세히 설명하십시오. 코드를 보지 않아도 작동하지 않는 이유는 말할 수 없습니다. – tnw

+0

수정 해 주셔서 감사합니다. **하지만 ** 코드를 보여주십시오 **. – tnw

답변

6

웹 브라우저 컨트롤에는 loadevent (가지고있는 항목)가 있습니다. LoadCompleted : DOM이 완전히로드되면 실행됩니다.

이벤트를 바인딩하고 이벤트 메서드에서 즉시 대신 문서를 가져옵니다.

//root is a grid element identified in the XAML 
    public WebBrowser webb; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     webb = new WebBrowser(); 
     webb.Visibility = System.Windows.Visibility.Hidden; 
     root.Children.Add(webb); 
     webb.LoadCompleted += webb_LoadCompleted; 
     webb.Navigate("http://www.google.com"); 
    } 

    void webb_LoadCompleted(object sender, NavigationEventArgs e) 
    { 
     MessageBox.Show("Completed loading the page"); 

     mshtml.HTMLDocument doc = webb.Document as mshtml.HTMLDocument; 
     mshtml.HTMLInputElement obj = doc.getElementById("gs_taif0") as mshtml.HTMLInputElement; 
     mshtml.HTMLFormElement form = doc.forms.item(Type.Missing, 0) as mshtml.HTMLFormElement; 

     webb.LoadCompleted -= webb_LoadCompleted; //REMOVE THE OLD EVENT METHOD BINDING 
     webb.LoadCompleted += webb_LoadCompleted2; //BIND TO A NEW METHOD FOR THE EVENT 
     obj.value = "test search"; 
     form.submit(); //PERFORM THE POST ON THE FORM OR SEARCH 
    } 

    //SECOND EVENT TO FIRE AFTER YOU POST INFORMATION 
    void webb_LoadCompleted2(object sender, NavigationEventArgs e) 
    { 
     MessageBox.Show("Completed loading the page second time after post"); 
    } 

mshtml.HTMLDocument로 doc = wb.Document를 수행해야합니다. loadcompleted 이벤트에서. 로드가 완료 될 때까지 문서를 가져올 수 없기 때문입니다.

+0

webb_Navigated get이 표시된대로 실행됩니다. 그러나 webb_LoadCompleted의 아무 것도 호출되지 않습니다. webb_loadcompleted 영역 아래의 모든 메시지 상자를 제거했지만 아무 것도 발생하지 않습니다. – user3175176

+0

나는 빠른 테스트를 실시했으며 컨트롤이 결코 실행되지 않는 창에 배치되지 않는 것처럼 보입니다. 다음과 같이 시도하십시오. webb.Visibility = System.Windows.Visibility.Hidden; root.Children.Add (webb); 여기서 root는 그리드 요소의 이름입니다. – user2453734

+0

나는 당신이 말한대로 행동하고 그것을 얻을 수있었습니다. 이 재귀 적으로 할 수있는 방법이 있습니까? 예를 들어 원본 페이지로 이동하면 검색 조건을 입력하고 입력을 클릭합니다. Navigated 및 LoadCompleted 구성 요소를 새로 추가하려고 시도했지만 webb_LoadCompleted 구성 요소에서 실행되지 않았습니다. – user3175176

관련 문제