2.InternetExplorer.Application方式,需要引入接口:'在VBA编辑器窗口依次点击 工具==引用 勾选Microsoft Internet Controls 确定,再运行,OK!
Do Until ie.ReadyState = READYSTATE_COMPLETE And ie.busy = False
DoEvents
其中READYSTATE_COMPLETE的值为4.
document亦具有readystate状态,其值为四种字符串,感兴趣的当为”complete”。
方法二:
NavigateComplete2事件判断。
方法三:页面特殊字眼判断。
t1 = Timer
Do Until Timer > t1 + 5 '需要时间触发网页上的onblur函数
DoEvents
在VBA中使用Sleep函数,需要添加:
Private Declare Sub Sleep Lib "kernel32" (ByValdwMilliseconds As Long)
' Sleep (53000)
'如下,可以暫停10秒.实现类似于Sleep函数的功能
'newHour = Hour(Now())
'newMinute = Minute(Now())
'newSecond = Second(Now()) + 10
'waitTime = TimeSerial(newHour, newMinute, newSecond)
'Application.Wait waitTime
利用事件驱动方式将相关函数预设为空函数。待证实
DimWithEvents ie As SHDocVw.InternetExplorer
'Private Subie_NavigateComplete2(ByVal pDisp As Object, URL As Variant)
'pDisp.Document.parentWindow.execScript "window.alert=null;"
'pDisp.Document.parentWindow.execScript "window.confirm=null;"
'pDisp.Document.parentWindow.execScript "window.showModalDialog=null;"
'pDisp.Document.parentWindow.execScript "window.open=null;"
'End Sub
原理和上面的相似,但不需要用到事件驱动方式。待证实,可能不适合动态产生的信息窗口
Set objscr = .Document.createElement_x("script") '创建一个脚本元素
objscr.Text = "window.confirm=function(x){return true;};" 'true是点击“确定”,false是点击“取消”
.Document.body.appendChild objscr '将脚本元素添加到body里
.document.getElementByIdx_x("submit").Click ‘会产生弹出窗口的执行语句
感觉此方法与InternetExplorer.Application不协调,但是我唯一成功使用过的方法。这种方法应该算是软件自动化的一个基础,例如编写游戏外挂。
找到弹出窗口的窗口句柄,并向其上的按钮发送单击事件从而关闭窗口。已证实可用,可应付动态产生的信息窗口
MicrosoftSpy++:工具,用于取得窗口类名、名称,控件类名、名称和WM信息等。
FindWindow:Win32 API函数,功能为取得窗口句柄
FindWindowEx: Win32 API函数,功能为取得窗口中控件的句柄
SendMessage: Win32 API函数,发送WM信息
声明部分:
Private Declare PtrSafe Function FindWindowEx Lib"user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByValhWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As Any) As Long 'API抓窗口函数
Private Declare PtrSafe Function GetWindowText Lib"user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVallpString As String, ByVal cch As Long) As Long 'api取窗口文本函数
Private Declare PtrSafe Function FindWindow Lib"user32" Alias "FindWindowA" (ByVal lpClassName As String,ByVal lpWindowName As String) As Long
Private Declare PtrSafe Function SendMessage Lib"user32" Alias "SendMessageA" (ByVal hwnd As Long, ByValwMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const MK_LBUTTON = &H1
执行语句部分:
Do Until FindWindow("#32770", "来自网页的消息") >0
DoEvents
hwd = FindWindow("#32770", "来自网页的消息") '网页对话框的句柄
Do Until FindWindowEx(hwd, 0, "Button", "确定") > 0
DoEvents
hwd_child = FindWindowEx(hwd, 0, "Button", "确定") '保存按钮的句柄
SendMessage hwd_child, BM_CLICK, 0, 0 '发送鼠标单击 ‘这一句似乎不能起作用,下面两句可以完成点击功能
SendMessage hwd_child, WM_LBUTTONDOWN, 0, ByVal0 '点击“确定”按钮(按下左键)
SendMessage hwd_child, WM_LBUTTONUP, 0, ByVal0 '点击“确定”按钮(松开左键)
注意:由于网页和程序是异步的,所以要防止弹出窗口还没准备好,而执行语句已经到达,故上面层层检查弹出窗口是否已经准备好,最好在发送WM信息前再延时1秒,已防意外。
1.直接调用
Document
代表整个 HTML 文档,可被用来访问页面中的所有元素
Anchors
代表 <a> 元素集合
代表 <body> 元素
Forms
代表 <form> 元素集合
Frames
代表 <frame> 元素或<iframe> 元素集合
Images
代表 <img> 元素集合
Links
代表 <link> 元素集合
Options
代表 <option> 元素集合(select元素里面可以直接使用)
Cells
代表 <td> 元素集合(table元素里面可以直接使用)
代表 <tr> 元素集合(table元素里面可以直接使用)
对象集合,提供对文档中所有 HTML 元素的访问。
2.函数调用
getElementById(
“元素的id属性”)或all(“元素的id属性”)
:返回拥有指定id的元素;
getElementsByName(
“元素的name属性”)或all(“元素的name属性”)
:返回拥有指定名称的元素的集合;
getElementsByTagName_r(
“标签名称”)或all.tags(“标签名称”)
:返回该类标签的元素集合;
all(
索引号)
循环与InStr字符串查找结合;
getElementsByClassName(“class”)(n) 此函数可能没有实现,请参见getElementsByClassName。
3.树型结点查找
l父结点:parentNode
l子结点:childNodes (children, 在IE9、IE10模式下,可能要用此属性,可参见下一条内容:getElementsByClassName);
l
nodeName
(节点名称)
:元素节点的名称为其标签名,属性节点的名称为其属性名称;
l
nodeValue
(节点值)
:文本节点的值为其包含的文本,属性节点的值为其包含的属性值;
l
nodeType
(节点类型)
:元素节点为1、属性节点为2、文本节点为3、注释节点为8、文档节点为9
4.树型元素查找
l父元素:parentElement
l子元素集合:children,然后通过判断标签名称(
tagname
),值(
value
),内含文本(
innertext
)等方式来进行查找
l兄弟元素:nextSibling、previousSibling
以下内容未知。
目前这一方法IE9 IE10支持,返回的是一个对象集合,但是如果你的浏览器本身是IE9或者IE10,如果你用excel调入插件webbrowser插件,你可能仍然无法使用这一方法,但是可以解决。
1、如果你的浏览器本身IE9以下,那么如果还想用这种方法,就自己编辑一个函数,有点问题,这个问题就是如果你是IE9或者IE10,你是可以使用这个方法的,但是需要修改注册表。
因为IE浏览器不支持getElementsByClassName,所以你要自己写一个方法得到class
但是火狐浏览器知道getElementsByClassName,可以直接的用
<html>
<head>
<title></title>
<script type="text/javascript">
window.onload = function () {
var tagName = getClass("div","a1");
//
因为返回的是包含多个元素的数组,所以要遍历一下
for (var i = 0; i< tagName.length; i++) {
tagName[i].innerHTML= "你好";
}
var tagName = getClass("div","a2");
for (var i = 0; i< tagName.length; i++) {
tagName[i].innerHTML= "ALL好";
}
}
function getClass(tagname, className){
//tagname
指元素,
className
指
class
的值
//
判断浏览器是否支持
getElementsByClassName
,如果支持就直接的用
if (document.getElementsByClassName){
return getElementsByClassName(className);
}
else {
//
当浏览器不支持
getElementsByClassName
的时候用下面的方法
var tagname =document.getElementsByTagName_r(tagname);
//
获取指定元素
var tagnameAll = [];
//
这个数组用于存储所有符合条件的元素
for (var i = 0; i< tagname.length; i++) {
//
遍历获得的元素
if(tagname[i].className == className) {
//
如果获得的元素中的
class
的值等于指定的类名,就赋值给
tagnameAll
tagnameAll[tagnameAll.length]= tagname[i];
}
}
return tagnameAll;
}
}
</script>
</head>
<body>
<div class="a1"></div>
<div class="a1"></div>
<div class="a1"></div>
<div class="a1"></div>
<div class="a2"></div>
<div class="a2"></div>
<div class="a2"></div>
<div class="a2"></div>
</body>
</html>
2、如果你的浏览器是IE9或者IE10,根据微软介绍,通常使用的webbrowser插件的版本是IE7,所以你需要修改注册表,让他默认的webbrowser用IE9或者IE10.
·getBoundingClientRect()方法在IE7下可以用getBoundingClientRect().bottom(right/top),但是IE9 10就需要加入元素名称getBoundingClientRect("id").bottom,才不会弹出错误。
innerHTML 设置或获取位于对象起始和结束标签内的 HTML
outerHTML 设置或获取对象及其内容的 HTML 形式
innerText 设置或获取位于对象起始和结束标签内的文本
outerText 设置(包括标签)或获取(不包括标签)对象的文本
innerText和outerText在获取时是相同效果,但在设置时,innerText仅设置标签内的文本,而outerText设置包括标签在内的文本。
简单的说innerHTML和outerHTML、innerText与outerText的不同之处在于:
1)、innerHTML与outerHTML在设置对象的内容时包含的HTML会被解析,而innerText与outerText则不会。
2)、在设置时,innerHTML与innerText仅设置标签内的文本,而outerHTML与outerText设置包括标签在内的文本。
对于一个id为"testdiv"的div来说,outerHTML、innerHTML以及innerTEXT三者的区别可以通过下图展示出来: