如何在控制台应用程序中使用带有 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 (将#修改为@)