Home > Enterprise >  Catching anchor element using SHDocVw.InternetExplorer
Catching anchor element using SHDocVw.InternetExplorer

Time:07-30

I want to catch the anchor element in website via vba.

I tried both as an MSHTML.IHTMLAnchorElement and MSHMTL.IHTMLBUttonELement but either way gives an error on Set line. Can anyone describe what's wrong with code below?

Sub goToWhtSpp()

    Dim ie As New SHDocVw.InternetExplorer
    
    ie.Visible = True
    ie.navigate "https://cooperatordirectory.com/"

    Do While ie.readyState <> READYSTATE_COMPLETE Or ie.Busy
    Loop

    Dim doc As MSHTML.HTMLDocument
        Set doc = ie.document
    Application.Wait 3000
    
    URL = "https://cooperatordirectory.com/search_results?location_value=Florida&adm_lvl_1_sn=FL&stateSearchLN=Florida&country_sn=US&location_type=administrative_area_level_1&stateSearch=FL&swlat=24.396308&nelat=31.000968&swlng=-87.634896&nelng=-79.974306&lat=27.6648274&lng=-81.5157535&faddress=Florida, USA&place_id=ChIJvypWkWV2wYgR0E7HW9MTLvc"
    ie.navigate URL


Dim aelement As MSHTML.IHTMLAnchorElement
Set aelement = doc.getElementsByClassName("btn btn-primary btn-block") ' err line

Dim btn As MSHTML.IHTMLButtonElement
Set btn = doc.getElementsByClassName("btn btn-primary btn-block") ' err line
Debug.Print btn.Value
End Sub


<a  href="/pro/20220324090906/connect">Send Message</a>

CodePudding user response:

You want a page load wait after each .navigate. In this case you only need the one .navigate and wait.

getElementsByClassName() returns a collection not a single node. So both your type declaration, subsequent SET attempt to this type, and later attempt to view the .value attribute will fail. .value is a property of a single node.

If you want the first "button" href then index into a correctly typed variable and call .item(0), or, more efficiently, use the querySelector() method of ie.document and pass in a single class of the multi-valued class (the one which still correctly identifies the target element).


Dim anchors As IHTMLElementCollection
Set anchors = .document.getElementsByClassName("btn-primary")

Dim anchor As IHTMLAnchorElement
Set anchor = .document.getElementsByClassName("btn-primary").Item(0)

Option Explicit

Public Sub PrintMessageUrl()
    
    Const URL As String = "https://cooperatordirectory.com/search_results?location_value=Florida&adm_lvl_1_sn=FL&stateSearchLN=Florida&country_sn=US&location_type=administrative_area_level_1&stateSearch=FL&swlat=24.396308&nelat=31.000968&swlng=-87.634896&nelng=-79.974306&lat=27.6648274&lng=-81.5157535&faddress=Florida, USA&place_id=ChIJvypWkWV2wYgR0E7HW9MTLvc"
    Dim ie As SHDocVw.InternetExplorer
    
    Set ie = New SHDocVw.InternetExplorer

    With ie
        .Visible = True
        .navigate URL
        Do While .readyState <> READYSTATE_COMPLETE Or .Busy: DoEvents: Loop
        Debug.Print .document.querySelector(".btn-primary").href
        .Quit
    End With

End Sub
  • Related