2014-01-13 97 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