如何解决如何在控制台应用程序中使用带有 System.Windows.Forms.Web.WebBrowser 的 javascipt 导航到页面
我正在为使用分页显示一长串姓名的网站开发抓取工具。Sample paging 分页是通过 javascript 完成的,代码如下:
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolderMain$GridViewDipByName','Page$4')">4</a>
我在控制台应用程序中使用 System.Windows.Forms.Web.WebBrowser (c# .Net Framework 4.7.2)。我按照 WebBroswer 的要求在单线程单元 (STA) 中运行 WebBrowser。
我可以使用简单的 URL 导航,但无法使用 javascript 导航。
public class SiteNavigator2
{
private WebBrowser _browser;
public event EventHandler<PageLoadedEventArgs> PageLoaded;
public SiteNavigator2()
{
_browser = new WebBrowser();
_browser.Visible = false;
}
protected virtual void OnPageLoaded(PageLoadedEventArgs e)
{
EventHandler<PageLoadedEventArgs> handler = PageLoaded;
handler?.Invoke(this,e);
}
public void NavigateViaUrl(string url) //Works great,the event handler gets raised,Example url "https://mysupercoolsite.com"
{
_browser.DocumentCompleted += BrowserLoadingStateChanged;
_browser.Navigate(url);
while (_browser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
Thread.Sleep(100);
}
}
public void NavigateViaJavascript(string script) // Event is never raised. The _browser.Document is never changed to reflect the javascript navigation.
{
_browser.DocumentCompleted += BrowserLoadingStateChanged;
//var x = _browser.Document?.InvokeScript(script);
_browser.Navigate($"javascript:{script}");// e.g. "javascript:__doPostBack('ctl00$ContentPlaceHolderMain$GridViewDipByName','Page$3')"
while (_browser.ReadyState != WebBrowserReadyState.Complete) // I even tried while(true) to confirm that the event handler never gets called and the browser documents never changes.
{
Application.DoEvents();
Thread.Sleep(100);
}
}
private void BrowserLoadingStateChanged(object sender,WebBrowserDocumentCompletedEventArgs e)
{
if( (sender as WebBrowser)?.ReadyState == WebBrowserReadyState.Complete)
{
_browser.DocumentCompleted -= BrowserLoadingStateChanged;
if (_browser.Document != null)
{
HtmlElementCollection elems = _browser.Document.GetElementsByTagName("HTML");
if (elems.Count == 1)
{
var html = elems[0].OuterHtml;
PageLoadedEventArgs args = new PageLoadedEventArgs
{
Html = html,Address = _browser.Url.AbsoluteUri
};
OnPageLoaded(args);
}
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。