2014-01-13 93 views
2

我在StackOverflow上看到了關於這個主題的幾個線程,但是他們都沒有提供答案。C#WPF - 等待頁面加載

我有一個按鈕,點擊後會打開一個不可見的網頁,導航到一個URL,輸入信息到一個框中,按下一個按鈕,然後刮擦屏幕上的信息。

基本上在點擊中我的代碼骨頭:

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

這是它得到棘手。

我正在尋找一種方法,以確保該頁面加載之前,試圖進入數據或刮屏幕。我看到了幾個線程,談論Navigated,IsLoaded,LoadCompleted以及BackgroundWork的東西,但我不能得到任何這些工作。

哪一個是最好的選擇來確定頁面已完全加載?你將如何讓選擇的方法工作?

我也無法從屏幕獲取數據,因爲WPF不使用相同的GetElementByID

編輯:

每下面的評論,下面是我碰到的錯誤:

  • 導航中第一個只要頁面已經被導航也是一樣,不一定等到所有對象被加載。這按預期工作,但不能用於我的目的。
  • IsLoaded從未返回true

    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) 
    { 

    } 

產生錯誤

在{文件名}中發生未處理的「System.NullReferenceException」類型異常

附加信息:未將對象引用設置爲對象的實例。

+2

請詳細說明「不能得到任何這些工作」。展示你的代碼,更詳細地描述每次嘗試的問題。沒有看到任何代碼,我們不能告訴你爲什麼它不起作用。 – tnw

+0

感謝您的編輯......但請**顯示您的代碼**。 – tnw

回答

6

webbrowser控件有一個loadedevent(你有): 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"); 
    } 

您需要將doc = wb.Document做爲mshtml.HTMLDocument;在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