C#WPF-等待页面加载
我在StackOverflow上看到了几个关于这个主题的帖子,但是没有一个能提供答案 我有一个按钮,当点击时,它会打开一个不可见的网页,导航到一个URL,将信息输入框中,按下按钮,然后在屏幕上搜索信息 我的代码的骨架基本上在单击中: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"); 这就是它变得棘手的地方 我正
WebBrowser wb = new WebBrowser;
wb.Visibility = System.Windows.Visibility.Hidden;
wb.Navigate("http://somepage.com");
这就是它变得棘手的地方
我正在寻找一种方法来确保在尝试输入数据或刮屏之前加载页面。我看到过一些关于导航
、卸载
、加载完成
以及后台工作
之类的帖子,但我无法让它们中的任何一个正常工作
确定页面已完全加载的最佳选项是什么?你将如何让选择的方法发挥作用
我也无法从屏幕上获取数据,因为WPF没有使用相同的GetElementByID
编辑:
根据下面的评论,以下是我遇到的错误:
- 一旦页面也被导航,就首先被导航,不一定要等到所有对象都被加载。这是预期的工作,但不能用于我的目的
从不返回trueIsLoaded
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的版本
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");
}