我在 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”类型的未处理异常
附加信息:对象引用未设置为对象的实例。