C#WebBrowser导航冻结

时间:2016-03-16 13:52:42

标签: c# .net web browser

我需要从一些网站上抓取数据,但我目前陷入困境,无法解决严重问题。

当我登录其中一些网站时,会在新页面中打开用户仪表板。这是问题的开始。我需要取消打开新页面,而应该导航到同一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 会尝试导航到信息中心,但它无法超越WebBrowserNavigating冻结,文档永远不会完成。

请帮我解决这个问题。这对我来说非常重要。

0 个答案:

没有答案