问题描述
我正在为使用分页显示一长串姓名的网站开发抓取工具。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 (将#修改为@)