我正在尝试编写一个简短的VBA代码来点击网站上的按钮,首先按其类名搜索,然后按id:
Sub Autoclick[enter image description here][1]()
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "http://stackoverflow.com/"
IE.Visible = True
While IE.Busy
DoEvents
Wend
IE.Document.getElementsByClassname("nav mainnavs").getElementById("nav-jobs").Click
End Sub
但是代码不会单击“作业”按钮。我知道我可以直接使用getelementbyid,但我仍然想知道为什么一起使用getelementsbyclassname和getelementbyid是行不通的。
附加图片包含网站的html代码。
非常感谢您的帮助!
答案 0 :(得分:1)
我仍然想知道为什么使用getelementsbyclassname和 getelementbyid在一起是行不通的。
因为代码IE.Document.getElementsByClassname("nav mainnavs").getElementById("nav-jobs")
导致错误438:对象不支持此属性或方法。
它不起作用,因为getElementsByClassName("nav mainnavs")
返回div
而div没有任何getElementById
方法。
要按元素ID搜索div
,可能需要循环遍历它的所有元素并检查它们的ID:
Dim mainnavs
Set mainnavs = IE.document.getElementsByClassName("nav mainnavs")
If mainnavs.Length > 0 Then
Dim mainnavItem ' this is a div element and it doesn't have .getElementById() method
Set mainnavItem = mainnavs.Item(0)
Dim itm
For Each itm In mainnavItem.all
If itm.ID = "nav-jobs" Then
itm.Click
Exit For
End If
Next itm
Else
MsgBox "getElementsByClassName('nav mainnavs') didn't return any elements"
End If
当我将相同的方法应用到我公司的网站时,它会继续 显示消息框"没有返回任何元素"
这意味着页面上不存在具有此类名称的元素。
您是否等到页面完全加载?
While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE: DoEvents: Wend
为什么我们要在For循环中执行mainnavItem.all
这是因为没有其他可能通过其id搜索元素。因此,我们会检查mainnavItem
的所有子项并检查ID。