VBA нажать веб-кнопку с динамическим elementID и повторяющимся классом

Я совсем новичок в VBA/html, пытаюсь автоматизировать заполнение формы, но даже не могу ее назвать... Я искал в Интернете несколько недель, пытаясь найти много разных кодовых комбинаций, но ни одна из них не добралась до меня.

HTML-код / ​​элемент выглядит следующим образом:

div title:"TextText" class:"text-truncate mb-2" id="abc_sidebar_startmenuitem" data-type="record" data-appid="82" data url="index.cfm?Xxx=&Yyy=">

i class="fa icon-app-82 mr-1 fa-fw">/i>

span class="clickable" id="ext-eng123">Text/span>
/div>

Проблема в том, что class="clickable" 30-е появление кликабельно на странице, id="ext-eng123" построен из текста ext-eng и 3 переменные неизвестные цифры, всегда разные.

Пример используемого кода VBA:

Sub GetClick()
    Dim ie As Object
    Set ie = CreateObject("internetexplorer.application")
    With ie
        .Visible = True
        .navigate "https://company.application.com/home/index.cfm?Tab=home"
        Do While .Busy
            DoEvents
        Loop
        Do While .readyState <> 4
            DoEvents
        Loop
    End With
    Dim objIE As Object
    objIE = document.getElementByClassName("clickable")(29)
    objIE.Click
End Sub

Я перепробовал более 10 различных примеров кода, включая номер кадра вызова, но ни один из них не работал, я застрял.

1 ответ

Попробуйте следующий код. Трудно дать какое-либо решение без игры с этим сайтом. Они всегда гипотетичны.

Sub GetClick()
    Dim IE As New InternetExplorer, Html As HTMLDocument

    With IE
        .Visible = True
        .Navigate "https://company.application.com/home/index.cfm?Tab=home"
        While .Busy = True Or .ReadyState < 4: DoEvents: Wend
        Set Html = .Document
    End With

    ''If the problem still persists, make sure to put here some delay

    Html.querySelector(".clickable[id^='ext-eng']").Click
End Sub

Другой подход может быть что-то вроде (если слово "Текст" нигде не появляется с таким же именем класса):

For Each elem In Html.getElementsByClassName("clickable")
    If InStr(elem.innerText, "Text") > 0 Then elem.Click: Exit For
Next elem

Ссылка для добавления:

Microsoft Internet Controls
Microsoft HTML Object Library
Другие вопросы по тегам