Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF-等待页面加载_C#_Wpf_Webbrowser Control_Loaded - Fatal编程技术网

C#WPF-等待页面加载

C#WPF-等待页面加载,c#,wpf,webbrowser-control,loaded,C#,Wpf,Webbrowser Control,Loaded,我在StackOverflow上看到了几个关于这个主题的帖子,但是没有一个能提供答案 我有一个按钮,当点击时,它会打开一个不可见的网页,导航到一个URL,将信息输入框中,按下按钮,然后在屏幕上搜索信息 我的代码的骨架基本上在单击中: WebBrowser wb = new WebBrowser; wb.Visibility = System.Windows.Visibility.Hidden; wb.Navigate("http://somepage.com"); 这就是它变得棘手的地方 我正

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

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

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

WebBrowser wb = new WebBrowser;
wb.Visibility = System.Windows.Visibility.Hidden;
wb.Navigate("http://somepage.com");
这就是它变得棘手的地方

我正在寻找一种方法来确保在尝试输入数据或刮屏之前加载页面。我看到过一些关于
导航
卸载
加载完成
以及
后台工作
之类的帖子,但我无法让它们中的任何一个正常工作

确定页面已完全加载的最佳选项是什么?你将如何让选择的方法发挥作用

我也无法从屏幕上获取数据,因为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”只能出现在+=或的左侧-=

产生错误

{filename}中发生类型为“System.NullReferenceException”的未处理异常

其他信息:对象引用未设置为对象的实例


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

请详细说明“无法使任何一个都正常工作”。显示您的代码,更详细地描述每次尝试的问题。我们不能告诉你为什么没有看到任何代码它就不能工作。谢谢你的编辑。。。但请出示你的密码。韦伯被解雇了,如图所示。然而,webb_LoadCompleted中没有任何内容被调用。除了webb_loadcompleted区域下的MessageBox之外,我移除了所有东西,但什么也没有发生。我运行了一个快速测试,看起来如果控件从未放在窗口上,它将永远不会启动。尝试以下操作:webb.Visibility=System.Windows.Visibility.Hidden;root.Children.Add(webb);其中root是网格元素的名称。我按照您所说的做了,并且能够让它工作。有没有一种递归的方法?例如,当我进入原始页面时,我输入搜索条件并单击enter。我尝试添加一个新的Navigated和LoadCompleted组件,但它们都不会从webb_LoadCompleted组件中触发。您应该能够继续导航webbrowser,而不必重新绑定它们应该始终触发的事件,只要您继续使用同一webbrowser实例。如果您使用的url使用类似ajax的东西发布搜索条件。加载的事件可能永远不会触发。我必须查看该网站以提供更多关于如何完成它的信息。它不是AJAX,当您单击submit时,它实际上会导航到一个单独的页面。但是,正如上面的示例所示,我正在加载第二页的LoadCompleted事件中设置文本字段。如果我继续使用相同的LoadCompleted事件,它将尝试继续搜索不存在的按钮。一个类似的例子是导航到谷歌,等待它加载,当它加载时,输入搜索条件,单击搜索,等待搜索结果,并抓取前五个链接。
    //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"); 
    }