2

我在 StackOverflow 上看到了几个关于这个主题的主题,但是似乎没有一个提供答案。

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

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

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

这就是棘手的地方。

我正在寻找一种方法来确保在尝试输入数据或抓取屏幕之前加载页面。我见过几个讨论Navigated, IsLoaded,LoadCompleted以及其他BackgroundWork东西的线程,但我无法让其中任何一个工作。

哪个是用于确定页面已完全加载的最佳选项?您将如何使所选方法发挥作用?

我也无法从屏幕上获取数据,因为 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”类型的未处理异常

附加信息:对象引用未设置为对象的实例。

4

1 回答 1

7

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

于 2014-01-13T20:13:28.847 回答