VBA getelementsbyclassname与getelementsbyid一起使用

时间:2016-10-02 02:40:10

标签: vba excel-vba excel

我正在尝试编写一个简短的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代码。

非常感谢您的帮助!

1 个答案:

答案 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

enter image description here

  

当我将相同的方法应用到我公司的网站时,它会继续   显示消息框"没有返回任何元素"

这意味着页面上不存在具有此类名称的元素。

您是否等到页面完全加载?

While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE: DoEvents: Wend
  

为什么我们要在For循环中执行mainnavItem.all

这是因为没有其他可能通过其id搜索元素。因此,我们会检查mainnavItem的所有子项并检查ID。