用程序來控制一個網頁,實現自動輸入等操作

我用VBS試了下,確實可用。與VBA的區別僅是把“DoEvents”換爲“Wscript.sleep 800”即可。

------------------------------------------------------------以上爲轉載者的註明---------------------------------------------------------------

附:看到有朋友自己弄的時候出錯了,所以我做了兩個demo,一個excel版,另一個c#版,有需要的朋友可以到文章最後下載參考一下。另外,文章改了一些疏漏。

首先今天要說的東西跟遊戲無關,你是不是有時候會遇到,在某個網頁上重複着幾十次的簡單而又無聊的錄入或點擊等工作?比如你的程序需要測試,需要註冊大量的測試郵箱。比如你的老闆是個變態,讓你去各個論壇發大量的垃圾貼子(最無恥行爲,純屬舉例)。或者,你需要定時的到某一個網頁上執行某一些行爲,比如上班下班的出勤打卡系統,等等吧,

如果有,那麼我今天所介紹的或許會對你有幫助。
當然,如果你要操作的這些網頁都是自己開發的,那麼無所謂了,你在多開發個工具就行了,但是我說的上面這些都是第三方的網頁,你控制不了它們,如果遇到上上述情況,而你是一個挨踢程序員,而你又選擇老老實實的重複着這些無聊又費時的工作,那你就真該挨踢了。
要實現這些功能,你只需要用程序控制這些網頁,讓網頁聽你的就行了。要動手實現這一系列的功能,你需要做幾個簡單的準備。
1,OS環境:Windows
2,IE瀏覽器
3,工具:Excel或者Visual Studio
先來看看如何用Excel來控制一個網頁。
新建一個Excel並且進入VBA,標準模式,什麼?不知道VBA?你可以找我的兩個老師問一下,他們一個姓百,另一個姓谷,誒?你說你也認識?那大家都是自己人了,你什麼時候請吃飯啊?
如下圖。

我是日文系統,中文的你對照着自己來吧...
要對IE進行操作,首先需要引入兩個插件
HTML Object Library
Microsoft Internet Controls
如圖

打開IE,你只需要下面幾行代碼
[vb] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Sub Main()  
  2.     Dim ie As Object  
  3.     Set ie = CreateObject("InternetExplorer.Application")  
  4.     ie.Visible = True  
  5. End Sub  

比如我要打開百度,那就這樣
[vb] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. ie.Navigate "http://www.baidu.com"  

接着你需要等待頁面加載
[vb] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. While ie.ReadyState <> 4 Or ie.Busy = True  
  2.     DoEvents  
  3. Wend  

好了,百度打開了,是不是很簡單,不過你也會說,打開個網頁算什麼,隨便一個程序都可以吧,好吧,咱們下面來實現自動搜索。
首先,咱們用VBA在百度的輸入框裏輸入幾個文字,百度的輸入框的代碼如下
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <input type="text" name="wd" id="kw1" maxlength="100" style="width:474px;" autocomplete="off">  

那我們就可以通過這個id來對輸入框進行輸入,如下
[vb] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. ie.Document.getElementById("kw1").value = "hellow world"  

如果你上面都沒有出錯的話,"hellow world"應該已經被加入到輸入框裏了。
那麼下面用VBA來點擊搜索按鈕,進行搜索。百度的搜索按鈕代碼如下
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <input type="submit" value="百度一下" id="su1" class="btn" onmousedown="this.className='btn btn_h'" onmouseout="this.className='btn'">  

看到id了吧,那就簡單了,下面這樣來點擊它
[vb] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. ie.Document.getElementById("su1").click  

怎麼樣,自動搜索完成了吧
當然,這只是一個最簡單的例子而已,如果沒有id怎麼辦?你也可以下下面這樣用它
[vb] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. ie.document.all  
  2. ie.document.body  
  3. ie.document.getElementsByName  
  4. ie.document.getElementsByTagName  

看到了吧,和JS很像,如果你不願意查相關的API的話,那你就拿JS的操作方法往上面套用吧
下面來看另一個頁面的結構,比如下面這樣
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <html>  
  2. <frameset cols="25%,50%,25%">  
  3.   <frame src="frame_a.htm" />  
  4.   <frame src="frame_b.htm" />  
  5.   <frame src="frame_c.htm" />  
  6. </frameset>  
  7. </html>  

如果你要操作這個頁面的子頁面,也很簡單
[vb] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Dim objFRAME As FramesCollection  
  2. Set objFRAME = ie.document.frames  
  3. Dim HW As HTMLWindow2  
  4. Set HW = objFRAME(1)  
  5. HW.document.all  
  6. ...  

這個是操作索引爲1的子頁面,當然你也可以循環所有的子頁面,來做的要做的事。
上面所介紹的都是先打開一個頁面,然後再進行操作,如果需要操作一個已經打開的頁面,你需要這樣。
[vb] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Dim objShell  As Object  
  2. Dim objIE     As Object  
  3. Dim n         As Integer  
  4. Set objShell = CreateObject("Shell.Application")  
  5. For n = objShell.Windows.Count To 1 Step -1  
  6.     Set objIE = objShell.Windows(n - 1)  
  7.     If objIE Is Nothing Then  
  8.         Exit For  
  9.     End If  
  10.     If Right(UCase(objIE.FullName), 12) = "IEXPLORE.EXE" Then  
  11.         Debug.Print objIE.document.URL '測試,輸入URL  
  12.         If objIE.document.URL = "http://www.baidu.com" Then '看看是不是你要的頁面  
  13.             '找到你要操作的頁面了,開始處理  
  14.         End If  
  15.     End If  
  16. Next  
  17. Set objShell = Nothing  

excel就說這麼多了。


下面用.net來做,既然前面用了VBA,這裏我就不用VB再重複了,換用C#來實現。
打開Visual Studio,新建一個項目,同樣,這次你需要引入三個插件
HTML Object Library
Microsoft Internet Controls
Microsoft Shell Controls And Automation
如圖


啓動IE,並打開百度
[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer();  
  2. ie.DocumentComplete += ie_DocumentComplete;//等待頁面讀取事件  
  3. ie.Navigate("http://www.baidu.com");  
  4. ie.Visible = true;  

等待頁面讀取你需要加一個事件

[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. private void ie_DocumentComplete(object pDisp, ref object URL)  
  2. {  
  3.     ie_Read = true;  
  4. }  
然後在設置了URL之後,調用下面的compWait();函數進行等待
[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. private bool ie_Read = false;  
  2.         private void compWait()  
  3.         {  
  4.             while (ie_Read != true)  
  5.             {  
  6.                 Application.DoEvents();  
  7.             }  
  8.         }   


獲取Document
[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. shtml.HTMLDocument doc = ie.Document;  

同樣,在輸入框裏輸入文字
[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. doc.getElementById("kw1").value = "hellow world";  

開始搜索。
[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. doc.getElementById("su1").click();  

下面利用c#如何來操作已經打開的瀏覽器呢?看下面代碼
[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public static SHDocVw.InternetExplorer getInternetExploer(string url)  
  2. {  
  3.     var shell = new Shell32.Shell();  
  4.     var windows = (SHDocVw.IShellWindows)shell.Windows();  
  5.     SHDocVw.InternetExplorer ie;  
  6.     foreach (object window in windows)  
  7.     {  
  8.         ie = window as SHDocVw.InternetExplorer;  
  9.         if (ie != null &&   
  10.                 string.Equals(System.IO.Path.GetFileName(ie.FullName),  
  11.                 "iexplore.exe", StringComparison.CurrentCultureIgnoreCase))  
  12.         {  
  13.             if (ie.LocationURL == url)  
  14.             {  
  15.                  return ie;  
  16.             }  
  17.         }  
  18.     }  
  19.     return null;  
  20. }  

好了,其他的方法如
[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. doc.body  
  2. doc.getElementsByName  
  3. doc.getElementsByTagName  

等等,自己套用一下就可以了
接下來是frame操作,如下
[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. mshtml.HTMLDocument doc2 = ie.Document;  
  2. var frame = doc2.frames.item(0);  
  3. var doc = frame.Document;  
  4. doc.getElementById  
完了,操作方法基本上都大同小異吧。
在使用.net來操作瀏覽器的時候,我發現操作同一個頁面時,如果頁面發生刷新或者跳轉等動作後,程序經常會出bug,網上搜索了一下,發現還真不是我一個人,那如何來避免呢?
因爲使用.net來第一次操作頁面的時候是肯定不會出錯的,必須是2次或2次以上纔會出現錯誤,所以我們可以做兩個程序,在一個程序中調用另一個,調用完之後,就把它關閉掉,這樣每次都相當於啓動一個新程序,就不會出bug了。
啓動一個新程序用下面代碼
[csharp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public static void runSubWindow(String command)  
  2. {  
  3.     ProcessStartInfo psInfo = new ProcessStartInfo();  
  4.     psInfo.FileName = command;   
  5.     psInfo.CreateNoWindow = true;  
  6.     psInfo.UseShellExecute = false;  
  7.     psInfo.RedirectStandardOutput = true;  
  8.     Process p = Process.Start(psInfo);  
  9.     string output = p.StandardOutput.ReadToEnd();  
  10. }  

傳入你的程序的路徑,就可以打開它了。

有了上面的知識,你可以自由的發揮了,比如你做一個定時程序,在上班時間自動打卡,然後自己接着睡一會兒....噓!!這絕對不是我說的。

demo源碼下載

http://lufylegend.com/lufylegend_download/IE.zip



今天就介紹這麼多了,歡迎繼續關注我的博客

轉載請註明:轉自lufy_legend的博客http://blog.csdn.net/lufy_legend
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章