由於項目需要,需要擷取網頁內容並自動填寫表單,所以決定使用webbrowser控制項。經過筆者一番百度,我再一次覺得,網上的內容少之又少,大多數都是提交完表單就沒事了,那擷取提交表單後怎麼知道成沒成功啊。怎麼擷取登入成功後的頁面呢。所以我在這裡講的全一點:
商務程序大體是:
1.擷取一個頁面的html代碼
2.從中找出type不是submit的<input>標籤,填寫內容
3.找到所有type是submit的<input>標籤,類比點擊提交
4.擷取提交後的頁面
那麼我的解決思路就是:
0X01:為第一次頁面載入成功添加一個事件1,為什麼要用添加事件的方式呢。因為如果不這樣,經常會擷取不到webbrowser的DocumentText或者擷取不全,導致程式很不穩定。
0X02:自動填寫表單並提交。
0X03:這是最關鍵的一步,先把之前的事件1移除,然後加上載入成功事件2,這樣的話在點擊登入跳轉後不會呼叫事件1,而會呼叫事件2,事件2中可以擷取webbrowser的DocumentText,就沒有問題了(但是需要注意,步驟0X03的代碼一定要在點擊提交按鈕之前,否則提交了再修改事件就來不及了)
首先,不是視窗程序,需要引入using System.Windows.Forms;才能使用webbrowser控制項。之後就是代碼了:
WebBrowser wb = new WebBrowser();
wb.ScriptErrorsSuppressed = true;
wb.DocumentCompleted += wb_DocumentCompleted;//添加頁面第一次載入完成事件
private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)//網頁載入完後調用,但是為什麼調用多次。。。。。。。。 { if (!e.Url.Equals(this.uri))//防止一個網址不明原因的多次調用 { //not actually complete, do nothing return; } this.htmldocument = wb.Document; HtmlElementCollection elementcol = this.htmldocument.GetElementsByTagName("input"); wb.DocumentCompleted -= wb_DocumentCompleted;//刪除頁面載入完成事件 wb.DocumentCompleted += wb_DocumentCompleted2;//添加新的頁面載入完成事件(也就是提交成功後頁面成功載入事件) foreach (HtmlElement ele in elementcol) { if (!ele.GetAttribute("type").Equals("submit"))//不是提交按鈕的都填成123 { ele.SetAttribute("value","123"); } else { ele.InvokeMember("click");//點擊一下 } } }
private void wb_DocumentCompleted2(object sender, WebBrowserDocumentCompletedEventArgs e) { System.Diagnostics.Debug.WriteLine(wb.DocumentText); //throw new NotImplementedException(); }