用程序来控制一个网页,实现自动输入等操作

附:看到有朋友自己弄的时候出错了,所以我做了两个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
  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
  1. ie.Navigate "http://www.baidu.com"  

接着你需要等待页面加载
[vb]  view plain  copy
  1. While ie.ReadyState <> 4 Or ie.Busy = True  
  2.     DoEvents  
  3. Wend  

好了,百度打开了,是不是很简单,不过你也会说,打开个网页算什么,随便一个程序都可以吧,好吧,咱们下面来实现自动搜索。
首先,咱们用VBA在百度的输入框里输入几个文字,百度的输入框的代码如下
[html]  view plain  copy
  1. <input type="text" name="wd" id="kw1" maxlength="100" style="width:474px;" autocomplete="off">  

那我们就可以通过这个id来对输入框进行输入,如下
[vb]  view plain  copy
  1. ie.Document.getElementById("kw1").value = "hellow world"  

如果你上面都没有出错的话,"hellow world"应该已经被加入到输入框里了。
那么下面用VBA来点击搜索按钮,进行搜索。百度的搜索按钮代码如下
[html]  view plain  copy
  1. <input type="submit" value="百度一下" id="su1" class="btn" onmousedown="this.className='btn btn_h'" onmouseout="this.className='btn'">  

看到id了吧,那就简单了,下面这样来点击它
[vb]  view plain  copy
  1. ie.Document.getElementById("su1").click  

怎么样,自动搜索完成了吧
当然,这只是一个最简单的例子而已,如果没有id怎么办?你也可以下下面这样用它
[vb]  view plain  copy
  1. ie.document.all  
  2. ie.document.body  
  3. ie.document.getElementsByName  
  4. ie.document.getElementsByTagName  

看到了吧,和JS很像,如果你不愿意查相关的API的话,那你就拿JS的操作方法往上面套用吧
下面来看另一个页面的结构,比如下面这样
[html]  view plain  copy
  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
  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
  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
  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
  1. private void ie_DocumentComplete(object pDisp, ref object URL)  
  2. {  
  3.     ie_Read = true;  
  4. }  
然后在设置了URL之后,调用下面的compWait();函数进行等待
[csharp]  view plain  copy
  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
  1. shtml.HTMLDocument doc = ie.Document;  

同样,在输入框里输入文字
[csharp]  view plain  copy
  1. doc.getElementById("kw1").value = "hellow world";  

开始搜索。
[csharp]  view plain  copy
  1. doc.getElementById("su1").click();  

下面利用c#如何来操作已经打开的浏览器呢?看下面代码
[csharp]  view plain  copy
  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
  1. doc.body  
  2. doc.getElementsByName  
  3. doc.getElementsByTagName  

等等,自己套用一下就可以了
接下来是frame操作,如下
[csharp]  view plain  copy
  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
  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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值