C# WPF - 等待页面加载

标签 c# wpf webbrowser-control loaded

我在 StackOverflow 上看到了几个与此主题相关的帖子,但似乎没有一个提供答案。

我有一个按钮,单击它会打开一个不可见的网页,导航到一个 URL,将信息输入一个框中,按下一个按钮,然后在屏幕上抓取信息。

我的代码的骨架基本上在点击中:

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

这就是它变得棘手的地方。

我正在寻找一种方法来确保在尝试输入数据或抓取屏幕之前加载页面。我已经看到几个讨论 NavigatedIsLoadedLoadCompleted 以及 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 的版本

The event 'System.Windows.Controls.WebBrowser.LoadCompleted' can only appear on the left hand side of += or -=

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

    }

产生错误

An unhandled exception of type 'System.NullReferenceException' occured in {filename}

Additional information: Object reference not set to an instance of an object.

最佳答案

webbrowser 控件有一个 loadedevent(你有): LoadCompleted:当 dom 完全加载时触发。

绑定(bind)事件,在事件方法中获取文档,而不是立即获取。

    //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 as mshtml.HTMLDocument;在 loadcompleted 事件中。因为在加载完成之前您无法获取文档。

关于C# WPF - 等待页面加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21095900/

相关文章:

C#异步服务器套接字定义?

c# - Lambda 表达式无法编译

c# - XElement 保存问题

wpf - TextBlock 样式触发器

c# - 如何从其 View 模型访问自定义控件依赖项属性

c# - 无法通过 FieldInfo 从 xaml 模板访问字段

c# - 为 WebBrowser 控件设置身份验证 header - ASP.NET

wpf - 使用 WebBrowser 控件时 IE 11 WebGL 性能变慢

c# - 什么是 C# 检查的 C++ 等价物

c# - 如何在 C# 应用程序中使用代理