2016-10-02 364 views
0

我试图写一个简短的VBA代码,通过它的类名首搜索点击一个按钮,在网站上,然后通过ID getElementsByClassName方法使用:VBA与getelementsbyid

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 

但是代码不会点击Jobs按钮。我知道我可以直接使用getelementbyid,但我仍然想知道为什么使用getelementsbyclassname和getelementbyid不起作用。

附加图片包含网站的html代码。

非常感谢您的帮助!

+0

您需要指定元素集合的索引。 getElementsByClassName凭借其名称返回多个元素,这些多个记录将返回到Collection中。要指定您想要的元素,您可以执行以下操作。 IE.Document.getElementsByClassname(“nav mainnavs”)(0)。 (0)部分表示返回第一个元素。将它们结合在一起,可以这样做:IE.Document.getElementsByClassname(“nav mainnavs”)。getElementById(“nav-jobs”)。单击。 –

回答

0

我还想知道为什么使用getelementsbyclassname和 getelementbyid在一起不起作用。

因为代码IE.Document.getElementsByClassname("nav mainnavs").getElementById("nav-jobs")原因误差438:对象不支持此属性或方法


它不起作用,因为getElementsByClassName("nav mainnavs")返回div和申报单没有任何getElementById方法。

要搜索div通过元素的id,它可能会需要遍历它的所有元素,并检查其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 

我们为什么要这么做mainnavItem.all在for循环

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

+0

非常感谢您的详细解答!我试过了,代码在stackoverflow.com上完美工作,但是当我将相同的方法应用到我公司的网站时,它始终显示消息框“没有返回任何元素”。另外我想知道,设置mainnavItem = mainnavs.Item(0)会使mainnavItem成为mainnavs元素集合中的第一件事,但是为什么我们要在For循环中执行mainnavItem.all? – Xavier