我需要从一些网站上抓取数据,但我目前陷入困境,无法解决严重问题。
当我登录其中一些网站时,会在新页面中打开用户仪表板。这是问题的开始。我需要取消打开新页面,而应该导航到同一WebBrowser
实例中的该URL。我处理取消打开新页面如下。
...
browser.AllowNavigation = true;
(browser.ActiveXInstance as SHDocVw.WebBrowser_V1).NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(HandleBrowserNewWindow);
...
protected virtual void HandleBrowserNewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed) {
Processed = true;
browser.Navigate(URL);
}
当HandleBrowserNewWindow
尝试打开新页面时,会调用 WebBrowser
方法。但是,当我将browser.Navigate(URL)
设置为Processed
之后拨打true
时,WebBrowser
无法导航,而且会冻结。
为了进行调试,我为WebBrowser
的{{1}}和Navigating
代表分配了方法。结果令人惊讶地嘲笑。以下是委托方法:
DocumentCompleted
这是我用于自动登录的代码块:
protected void BrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
Console.WriteLine("Doc Completed: {0}", e.Url);
}
protected void BrowserNavigating(object sender, WebBrowserNavigatingEventArgs e)
{
Console.WriteLine("Navigating: {0}", e.Url);
}
以下是我得到的输出:
...
browser.Navigate(LoginURL);
...
HtmlElement helUsername = browser.Document.GetElementById("username");
HtmlElement helPassword = browser.Document.GetElementById("password");
HtmlElement helLoginButton = browser.Document.GetElementById("btnLogin");
helUsername.Focus();
helUsername.SetAttribute("value", LoginUser);
helUsername.InvokeMember("change");
helUsername.RemoveFocus();
await Task.Delay(50);
helPassword.Focus();
helPassword.SetAttribute("value", LoginPass);
helPassword.InvokeMember("change");
helPassword.RemoveFocus();
await Task.Delay(50);
helLoginButton.InvokeMember("click");
正如您所看到的,登录页面导航两次,我实际在代码中导航一次。此外,Navigating: https://someurl.com/Login
Doc Completed: https://someurl.com/Login
Navigating: https://someurl.com/Login
Doc Completed: https://someurl.com/Login
Navigating: https://someurl.com/Dashboard
会尝试导航到信息中心,但它无法超越WebBrowser
。 Navigating
冻结,文档永远不会完成。
请帮我解决这个问题。这对我来说非常重要。