標籤:.net vba ie 瀏覽器 excel
首先今天要說的東西跟遊戲無關,你是不是有時候會遇到,在某個網頁上重複著幾十次的簡單而又無聊的錄入或點擊等工作?比如你的程式需要測試,需要註冊大量的測試郵箱。比如你的老闆是個變態,讓你去各個論壇發大量的垃圾貼子(最無恥行為,純屬舉例)。或者,你需要定時的到某一個網頁上執行某一些行為,比如上班下班的出勤打卡系統,等等吧,
如果有,那麼我今天所介紹的或許會對你有協助。
當然,如果你要操作的這些網頁都是自己開發的,那麼無所謂了,你在多開發個工具就行了,但是我說的上面這些都是第三方的網頁,你控制不了它們,如果遇到上上述情況,而你是一個挨踢程式員,而你又選擇老老實實的重複著這些無聊又費時的工作,那你就真該挨踢了。
要實現這些功能,你只需要用程式控制這些網頁,讓網頁聽你的就行了。要動手實現這一系列的功能,你需要做幾個簡單的準備。
1,OS環境:Windows
2,IE瀏覽器
3,工具:Excel或者Visual Studio
先來看看如何用Excel來控制一個網頁。
建立一個Excel並且進入VBA,標準模式,什嗎?不知道VBA?你可以找我的兩個老師問一下,他們一個姓百,另一個姓穀,誒?你說你也認識?那大家都是自己人了,你什麼時候請吃飯啊?
如。
我是日文系統,中文的你對照著自己來吧...
要對IE進行操作,首先需要引入兩個外掛程式
HTML Object Library
Microsoft Internet Controls
開啟IE,你只需要下面幾行代碼
Sub Main() Dim ie As Object Set ie = CreateObject("InternetExplorer.Application") ie.Visible = TrueEnd Sub
比如我要開啟百度,那就這樣
ie.Navigate "http://www.baidu.com"
接著你需要等待頁面載入
While ie.ReadyState <> 4 Or ie.Busy = TrueDoEventsWend
好了,百度開啟了,是不是很簡單,不過你也會說,開啟個網頁算什麼,隨便一個程式都可以吧,好吧,咱們下面來實現自動搜尋。
首先,咱們用VBA在百度的輸入框裡輸入幾個文字,百度的輸入框的代碼如下
<input type="text" name="wd" id="kw1" maxlength="100" style="width:474px;" autocomplete="off">
那我們就可以通過這個id來對輸入框進行輸入,如下
ie.Document.getElementById("kw1").value = "hellow world"
如果你上面都沒有出錯的話,"hellow world"應該已經被加入到輸入框裡了。
那麼下面用VBA來點擊搜尋按鈕,進行搜尋。百度的搜尋按鈕代碼如下
<input type="submit" value="百度一下" id="su1" class="btn" onmousedown="this.className=‘btn btn_h‘" onmouseout="this.className=‘btn‘">
看到id了吧,那就簡單了,下面這樣來點擊它
ie.Document.getElementById("su1").click
怎麼樣,自動搜尋完成了吧
當然,這隻是一個最簡單的例子而已,如果沒有id怎麼辦?你也可以下下面這樣用它
ie.document.allie.document.bodyie.document.getElementsByNameie.document.getElementsByTagName
看到了吧,和JS很像,如果你不願意查相關的API的話,那你就拿JS的操作方法往上面套用吧
下面來看另一個頁面的結構,比如下面這樣
<html><frameset cols="25%,50%,25%"> <frame src="frame_a.htm" /> <frame src="frame_b.htm" /> <frame src="frame_c.htm" /></frameset></html>
如果你要操作這個頁面的子頁面,也很簡單
Dim objFRAME As FramesCollectionSet objFRAME = ie.document.framesDim HW As HTMLWindow2Set HW = objFRAME(1)HW.document.all...
這個是操作索引為1的子頁面,當然你也可以迴圈所有的子頁面,來做的要做的事。
上面所介紹的都是先開啟一個頁面,然後再進行操作,如果需要操作一個已經開啟的頁面,你需要這樣。
Dim objShell As ObjectDim objIE As ObjectDim n As IntegerSet objShell = CreateObject("Shell.Application")For n = objShell.Windows.Count To 1 Step -1Set objIE = objShell.Windows(n - 1)If objIE Is Nothing ThenExit ForEnd IfIf Right(UCase(objIE.FullName), 12) = "IEXPLORE.EXE" ThenDebug.Print objIE.document.URL ‘測試,輸入URLIf objIE.document.URL = "http://www.baidu.com" Then ‘看看是不是你要的頁面‘找到你要操作的頁面了,開始處理End IfEnd IfNextSet objShell = Nothing
excel就說這麼多了。
下面用.net來做,既然前面用了VBA,這裡我就不用VB再重複了,換用C#來實現。
開啟Visual Studio,建立一個項目,同樣,這次你需要引入三個外掛程式
HTML Object Library
Microsoft Internet Controls
Microsoft Shell Controls And Automation
啟動IE,並開啟百度
SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();ie.Navigate("http://www.baidu.com");ie.Visible = true;
擷取Document
shtml.HTMLDocument doc = ie.Document;
同樣,在輸入框裡輸入文字
doc.getElementById("kw1").value = "hellow world";
開始搜尋。
doc.getElementById("su1").click();
下面利用c#如何來操作已經開啟的瀏覽器呢?看下面代碼
public static SHDocVw.InternetExplorer getInternetExploer(string url){var shell = new Shell32.Shell();var windows = (SHDocVw.IShellWindows)shell.Windows();SHDocVw.InternetExplorer ie;foreach (object window in windows){ie = window as SHDocVw.InternetExplorer;if (ie != null && string.Equals(System.IO.Path.GetFileName(ie.FullName),"iexplore.exe", StringComparison.CurrentCultureIgnoreCase)){if (ie.LocationURL == url){ return ie;}}}return null;}
好了,其他的方法如
doc.bodydoc.getElementsByNamedoc.getElementsByTagName
等等,自己套用一下就可以了
接下來是frame操作,如下
mshtml.HTMLDocument doc2 = ie.Document;var frame = doc2.frames.item(int.Parse(configs[2]));var doc = frame.Document;doc.getElementById
完了,操作方法基本上都大同小異吧。
在使用.net來操作瀏覽器的時候,我發現操作同一個頁面時,如果頁面發生重新整理或者跳轉等動作後,程式經常會出bug,網上搜尋了一下,發現還真不是我一個人,那如何來避免呢?
因為使用.net來第一次操作頁面的時候是肯定不會出錯的,必須是2次或2次以上才會出現錯誤,所以我們可以做兩個程式,在一個程式中調用另一個,調用完之後,就把它關閉掉,這樣每次都相當於啟動一個新程式,就不會出bug了。
啟動一個新程式用下面代碼
public static void runSubWindow(String command){ProcessStartInfo psInfo = new ProcessStartInfo();psInfo.FileName = command; psInfo.CreateNoWindow = true;psInfo.UseShellExecute = false;psInfo.RedirectStandardOutput = true;Process p = Process.Start(psInfo);string output = p.StandardOutput.ReadToEnd();}
傳入你的程式的路徑,就可以開啟它了。
有了上面的知識,你可以自由的發揮了,比如你做一個定時程式,在上班時間自動打卡,然後自己接著睡一會兒....噓!!這絕對不是我說的。
今天就介紹這麼多了,歡迎繼續關注我的部落格
轉載請註明:轉自lufy_legend的部落格http://blog.csdn.net/lufy_legend