综合网上各位高人的方法,经过几天的整合简化,最终实现外部对IE浏览器网页自动化操作,现写下总结。
窗体界面及控件不是本文主要内容,自行发挥。
实现网页自动化也就是脚本操作行为,脚本都是需要延时等待功能的,所以先在窗体代码开关声明延时API,以便随时使用:
Private Declare Sub Sleep Lib "kernel32.DLL" (ByVal dwMilliseconds As Long)
写一个用IE浏览器打开指定网页的Sub:
Sub 打开网站(strURLAs String)
Dim objb As Object
objb = CreateObject("WScript.Shell")
objb.Run("iexplore.exe " & strURL, 0)
objb = Nothing
Sleep(3000)
End Sub
写一个主操控Sub:这里面涉及到三个重点:
1.Shell.Application
2.InternetExplorer.Application
3.InternetExplorer.Application.Document对象的属性和方法
Sub 主操控()
Dim strURL As String, Account As String, Password As String, AppPath As String = ".\次程序.exe"
Dim objWin As Object, 传达操作指令 As Boolean
Do
strURL = Me.strURL.Text
Account = Me.Account.Text
Password = Me.Password.Text
传达操作指令 = False
For Each objWin In CreateObject("Shell.Application").Windows
'Debug.WriteLine(TypeName(objWin.document))'显示对象类名
If InStr(LCase(TypeName(objWin.document)),"htmldocumentclass") > 0 Then
IfobjWin.readyState = 4 Then
'Debug.WriteLine(objWin.LocationURL)'显示对象网址
If 0 = 1 Then
ElseIf objWin.LocationURLLike "*END*" Then '要结束自动操作的条件,可以用网址特征判断,当然也可以用别的方式,详细参见“InternetExplorer.Application的用法及属性解释”。
Exit Do
ElseIfobjWin.LocationURL Like "*" & strURL & "*" Then '要传达操作指令的条件,可以用网址特征判断
'以下为执行操作的方式,主程序不要执行具体操作,只传达指令,然后运行次程序操作,否则会在网页跳转后主程序出错。具体操作可参见“Document对象的属性和方法”。
'objWin.Document.all("form").target= "_self"
'objWin.Document.all("Account").value= Account
'objWin.Document.all("Password").value= Password
'objWin.Document.all("btn-submit").click()
'objWin.Navigate(objWin.document.links(line).href)
传达操作指令 = True
Exit For
ElseIfobjWin.LocationName Like "*标签名*" Then '要传达操作指令的条件,可以用网页标签名特征判断
传达操作指令 = True
Exit For
End If
Else
Exit For
End If
End If
Next
If 传达操作指令 Then
启动外部程序并等待程序退出(AppPath)
Else
打开网站(strURL) '没有操作指令时打开指定网址
End If
Sleep(2000) '必要的延时等待
Loop
End Sub
写一个启动外部程序并等待程序退出Sub:
Sub 启动外部程序并等待程序退出(AppPath As String)
Dim timeOut As Long = 20000
'创建一个新的进程结构
Dim pInfo As NewProcessStartInfo()
'设置其成员FileName为系统资料的Eula.txt
pInfo.FileName = AppPath
'运行该文件
Dim p As Process =Process.Start(pInfo)
'等待程序装载完成
p.WaitForInputIdle()
'等待程序退出
p.WaitForExit(timeOut)
'检查是否在超时前已关闭了.
If p.HasExited = False Then
'进行程还在运行
'看进程有没有回应
If p.Responding Then
p.CloseMainWindow() '关闭窗口
Else
p.Kill() '强行中断
End If
MessageBox.Show("可能出现特殊意外情况无法处理!程序关闭。")
End
Else
Debug.WriteLine("外部程序运行结束!")
End If
End Sub
次程序一般设置为不可见,同时还要读取主程序里的设置,可以通过文件读写实现。可以用“Scripting.FileSystemObject”。
次程序里执行操作的判断代码跟主程序里发送操作指令的判断代码是一样的,其它也类似,不同的是把主程序里的传达操作指令改为具体的网页操作,操作完本网页就直接END销毁次程序。
联系客服