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