2016-10-02 42 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