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


    附:看到有朋友自己弄的时候出错了。所以我做了两个demo,一个excel版,还有一个c#版,有须要的朋友能够到文章最后下载參考一下。另外。文章改了一些疏漏。

    首先今天要说的东西跟游戏无关,你是不是有时候会遇到。在某个网页上反复着几十次的简单而又无聊的录入或点击等工作?比方你的程序须要測试。须要注冊大量的測试邮箱。比方你的老板是个变态,让你去各个论坛发大量的垃圾贴子(最无耻行为,纯属举例)。或者。你须要定时的到某一个网页上运行某一些行为,比方上班下班的出勤打卡系统,等等吧,

    假设有,那么我今天所介绍的也许会对你有帮助。
    当然,假设你要操作的这些网页都是自己开发的,那么无所谓了。你在多开发个工具即可了,可是我说的上面这些都是第三方的网页。你控制不了它们。假设遇到上上述情况,而你是一个挨踢程序猿,而你又选择老老实实的反复着这些无聊又费时的工作。那你就真该挨踢了。


    要实现这些功能,你仅仅须要用程序控制这些网页,让网页听你的即可了。

    要动手实现这一系列的功能,你须要做几个简单的准备。
    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 = True
    End Sub

    比方我要打开百度。那就这样
    ie.Navigate "http://www.baidu.com"

    接着你须要等待页面载入
    While ie.ReadyState <> 4 Or ie.Busy = True
    	DoEvents
    Wend

    好了。百度打开了,是不是非常easy。只是你也会说,打开个网页算什么。随便一个程序都能够吧,好吧,咱们以下来实现自己主动搜索。
    首先。咱们用VBA在百度的输入框里输入几个文字,百度的输入框的代码例如以下
    <input type="text" name="wd" id="kw1" maxlength="100" style="474px;" autocomplete="off">

    那我们就能够通过这个id来对输入框进行输入,例如以下
    ie.Document.getElementById("kw1").value = "hellow world"

    假设你上面都没有出错的话,"hellow world"应该已经被增加到输入框里了。
    那么以下用VBA来点击搜索button,进行搜索。

    百度的搜索button代码例如以下

    <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.all
    ie.document.body
    ie.document.getElementsByName
    ie.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>

    假设你要操作这个页面的子页面,也非常easy
    Dim objFRAME As FramesCollection
    Set objFRAME = ie.document.frames
    Dim HW As HTMLWindow2
    Set HW = objFRAME(1)
    HW.document.all
    ...

    这个是操作索引为1的子页面,当然你也能够循环全部的子页面,来做的要做的事。
    上面所介绍的都是先打开一个页面,然后再进行操作,假设须要操作一个已经打开的页面。你须要这样。
    Dim objShell  As Object
    Dim objIE     As Object
    Dim n         As Integer
    Set objShell = CreateObject("Shell.Application")
    For n = objShell.Windows.Count To 1 Step -1
    	Set objIE = objShell.Windows(n - 1)
    	If objIE Is Nothing Then
    		Exit For
    	End If
    	If Right(UCase(objIE.FullName), 12) = "IEXPLORE.EXE" Then
    		Debug.Print objIE.document.URL '測试,输入URL
    		If objIE.document.URL = "http://www.baidu.com" Then '看看是不是你要的页面
    			'找到你要操作的页面了。開始处理
    		End If
    	End If
    Next
    Set 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.DocumentComplete += ie_DocumentComplete;//等待页面读取事件
    ie.Navigate("http://www.baidu.com");
    ie.Visible = true;

    等待页面读取你须要加一个事件

            private void ie_DocumentComplete(object pDisp, ref object URL)
            {
                ie_Read = true;
            }
    然后在设置了URL之后,调用以下的compWait();函数进行等待
    private bool ie_Read = false;
            private void compWait()
            {
                while (ie_Read != true)
                {
                    Application.DoEvents();
                }
            } 


    获取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.body
    doc.getElementsByName
    doc.getElementsByTagName

    等等,自己套用一下就能够了
    接下来是frame操作。例如以下
    mshtml.HTMLDocument doc2 = ie.Document;
    var frame = doc2.frames.item(0);
    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();
    }

    传入你的程序的路径,就能够打开它了。

    有了上面的知识,你能够自由的发挥了,比方你做一个定时程序,在上班时间自己主动打卡,然后自己接着睡一会儿....嘘!!

    这绝对不是我说的。

    demo源代码下载

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


    今天就介绍这么多了。欢迎继续关注我的博客

    转载请注明:转自lufy_legend的博客http://blog.csdn.net/lufy_legend
  • 相关阅读:
    Hadoop之HDFS的热备份
    Hadoop之联邦HDFS
    Hadoop之HDFS如何保证高可用
    Hadoop之HDFS的读流程
    Hadoop之HDFS数据写流程和写失败的情况
    Hadoop之HDFS的block、packet、chunk
    Hadoop之HDFS的元数据冷备份(CheckPoint)
    当ZooKeeper作为Dubbo的注册中心的时候,是怎么工作的?
    Dubbo
    mysql磁盘满了如何恢复
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6757188.html
Copyright © 2020-2023  润新知