none
使用webBrowser控制項載入某網頁,並利用HtmlElement.InvokeMember("click")點擊按鈕後,webBrowser變成空白 RRS feed

  • 問題

  • 大家好,我爬了許久的文卻一直沒找到相似的問題,第一次發問,若有什麼該注意的地方還請大家不吝指教。

    我利用以下的程式碼擷取網頁資料,第一步是連結到該網頁後,輸入一些日期時間、搜尋範圍等等的資料後,按下搜尋按鈕,網頁會依照我輸入的範圍查詢出我要的資料。 這段程式碼某些網頁可以正常運作,但某些網頁卻在我的webStandard_DocumentCompleted中利用btn_search.InvokeMember("click")點擊按鈕後, 我的webBrowser1變成空白一片,一直找不到原因,是否有前輩可提供可能的思路幫助我找到問題點,謝謝

    	private void button2_Click(object sender, EventArgs e)
            {
                webBrowser1.ScriptErrorsSuppressed = true;
                webBrowser1.DocumentCompleted += webStandard_DocumentCompleted;
                webBrowser1.Navigate("http://www.twse.com.tw/ch/trading/exchange/MI_INDEX/MI_INDEX.php");
            }
    
            private void webStandard_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                WebBrowser webB = (WebBrowser)sender;
    
                webB.DocumentCompleted -= webStandard_DocumentCompleted;
                webB.DocumentCompleted += webStandard_DocumentCompleted2;
    
                System.Windows.Forms.HtmlDocument htmlD = webB.Document;
                
                HtmlElement btn_search = htmlD.All["query-button"];
                HtmlElement text_date = htmlD.GetElementById("date-field");
                HtmlElement comb_category = htmlD.All["selectType"];
    
                text_date.SetAttribute("value", Sdate);
                comb_category.SetAttribute("value", "ALLBUT0999");            
                btn_search.InvokeMember("click"); 
    
            }
    
            private void webStandard_DocumentCompleted2(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                //另一區塊程式碼,以下省略
            }


               
    2016年5月22日 上午 07:48

解答

  • 您好,

    您可以使用 fiddler 錄一下,

    我看到沒有畫面是因為 server 的狀態為 Abort 。

    或許是動作太快了,

    你可以在 invoke click 之前 delay 一下,如下,

    private async void webStandard_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                WebBrowser webB = (WebBrowser)sender;
    
                webB.DocumentCompleted -= webStandard_DocumentCompleted;
                //webB.DocumentCompleted += webStandard_DocumentCompleted2;
    
                System.Windows.Forms.HtmlDocument htmlD = webB.Document;
    
                HtmlElement btn_search = htmlD.All["query-button"];
                HtmlElement text_date = htmlD.GetElementById("date-field");
                HtmlElement comb_category = htmlD.All["selectType"];
    
                //text_date.SetAttribute("value", Sdate);
                comb_category.SetAttribute("value", "ALLBUT0999");
                await Task.Delay(TimeSpan.FromSeconds(1));
                btn_search.InvokeMember("click");
    
            }


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 蘭克 2016年7月28日 上午 03:28
    2016年5月24日 上午 11:53

所有回覆

  • 您好,

    您可以使用 fiddler 錄一下,

    我看到沒有畫面是因為 server 的狀態為 Abort 。

    或許是動作太快了,

    你可以在 invoke click 之前 delay 一下,如下,

    private async void webStandard_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                WebBrowser webB = (WebBrowser)sender;
    
                webB.DocumentCompleted -= webStandard_DocumentCompleted;
                //webB.DocumentCompleted += webStandard_DocumentCompleted2;
    
                System.Windows.Forms.HtmlDocument htmlD = webB.Document;
    
                HtmlElement btn_search = htmlD.All["query-button"];
                HtmlElement text_date = htmlD.GetElementById("date-field");
                HtmlElement comb_category = htmlD.All["selectType"];
    
                //text_date.SetAttribute("value", Sdate);
                comb_category.SetAttribute("value", "ALLBUT0999");
                await Task.Delay(TimeSpan.FromSeconds(1));
                btn_search.InvokeMember("click");
    
            }


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 蘭克 2016年7月28日 上午 03:28
    2016年5月24日 上午 11:53
  • 您好,感謝您的回覆,但我不太懂您說用fiddler錄一下是什麼意思。不過加了您的程式碼後確實webBrowser能顯示了,但我先前有試過使用Thread.Sleep(1000)等待他讀取卻無效,您這段程式卻奏效了?
    2016年5月25日 下午 01:49
  • Use Thread.Sleep when you want to block the current thread.

    Use Task.Delay when you want a logical delay without blocking the current thread.

    Efficiency should not be a paramount concern with these methods. Their primary real-world use is as retry timers for I/O operations, which are on the order of seconds rather than milliseconds.

    Fiddler info please ref:

    http://www.telerik.com/fiddler

    https://dotblogs.com.tw/rainmaker/2016/05/19/132351


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2016年5月27日 上午 01:37