Как перейти по ссылке HTML с помощью VBA - PullRequest
2 голосов
/ 10 апреля 2020

Я пытаюсь щелкнуть ссылку на веб-сайте, как показано на скриншоте ниже. HTML код этой ссылки похож на <a target="_blank" href="gamit_main.htm?gamitId=163734">'3311-10310</a>.

Sample Screenshot

Так что у меня есть код, чтобы щелкнуть ссылку, например:

Set HTMLDoc = ie.Document
HTMLDoc.getElementsByTagName("a").Click

Но я получил ошибку как:

"Объект не поддерживает это свойство или метод".

Ссылка на код ссылки:

Code Screenshot

Полный код:

Sub Something()
    Dim ie As Object
    Dim HTMLDoc As MSHTML.HTMLDocument
    Dim ckt_No As String
    ckt_No = Range("A2").Value
    Set ie = CreateObject("InternetExplorer.Application")
    ie.Visible = True
    ShowWindow ie.Hwnd, SW_MAXIMIZE
    ie.Navigate "http://xyw.htm"
    Do While ie.Busy = True Or ie.ReadyState <> 4: DoEvents: Loop
    ie.Navigate "http:dgetcjdm_ckt_No&display_content=Y&noFormFields=Y&refresh=Y"
    Do While ie.Busy = True Or ie.ReadyState <> 4: DoEvents: Loop
    Set HTMLDoc = ie.Document
    HTMLDoc.getElementById("resultRow").getElementByTagName("a")(0).Click
End Sub

Код HTML следующий:

        <td align="center" height="15" title="1" class="tdborder">

            <font class="rtabletext">1</font>

        </td>



        <td align="Left" title="GAMITARM Status Date" class="tdborder" nowrap="">

            <font class="rtabletext">19-MAR-2020</font>

        </td>

        <td align="Left" title="Circuit Number" class="tdborder" nowrap="">

            <font class="rtabletext"><a target="_blank" href="gamit_main.htm?gamitId=168592">'70F934C8</a></font>

        </td>

        <td align="Left" title="CUSTOMER" class="tdborder" nowrap="">

            <font class="rtabletext">MICROSOFT CORPORATION</font>

        </td>

        <td align="Left" title="Customer Id" class="tdborder" nowrap="">

            <font class="rtabletext">8684</font>

        </td>


        <td align="Left" title="AO AM" class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>

        </td>

        <td align="Left" title="AO SD" class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>

        </td>

        <td align="Left" title="AO ED/AVP" class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>

        </td>

        <td align="Left" title="AO VP" class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>

        <td align="Left" title="LCON Phone Contact (SM Feed) " class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>

        </td>

        <td align="Left" title="LCON Cell Contact (SM Feed) " class="tdborder" nowrap="">

            <font class="rtabletext">&nbsp;</font>


        </td>

        <td align="Left" title="Programme Office Status" class="tdborder" nowrap="">

            <font class="rtabletext">New</font>


        </td>

        <td align="Left" title="Major Initiative" class="tdborder" nowrap="">

            <font class="rtabletext">Ethernet</font>

        </td>

        <td align="Left" title="Project" class="tdborder" nowrap="">

            <font class="rtabletext">APAC Singapore Ethernet Tail Rolls</font>

        </td>

        <td align="Left" title="Phase" class="tdborder" nowrap="">

            <font class="rtabletext">x.2.2.a</font>


        </td>

        <td align="Left" title="LOA received" class="tdborder" nowrap="">

            <font class="rtabletext">NO</font>

        </td>

        <td align="Left" title="Technical Connectivity details received" class="tdborder" nowrap="">

            <font class="rtabletext">NO</font>

        </td>

    </tr>

и я пытаюсь сосредоточиться на этой строке

            <font class="rtabletext"><a target="_blank" href="gamit_main.htm?gamitId=168592">'70F934C8</a></font>

Вот несколько снимков для родителя: Плз найти выделенные элементы

Iframe_Highlight Iframe_TagName -a_Highlight

Ответы [ 3 ]

1 голос
/ 10 апреля 2020

Я бы скомбинировал селектор класса для родительского узла с селектором атрибута = значение (используя оператор содержит *), чтобы нацелить дочерний тег на его href по его значению

htmlDoc.querySelector(".rtabletext [href*='gamitId=']").click

Нет необходимости извлекать более одного узла или для использования al oop

Это предполагает, что первый сопоставленный узел является желаемым. Вы всегда можете расширить значение href, используемое между '', чтобы сделать его более селекторным (или, в более общем случае, расширить селектор css, используемый querySelector, на целевой точный узел).

css селекторы

1 голос
/ 10 апреля 2020

Метод getElementsByTagName() возвращает коллекцию всех элементов в документе с указанным именем тега как объект HTMLCollection.

Таким образом, вы должны указать, какой элемент из коллекции следует щелкнуть. В этом случае первый, вероятно, самый безопасный выбор:

Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")    
Set HTMLDoc = ie.Document
HTMLDoc.getElementsByTagName("a")(0).Click

И, нажав F12 в Chrome, вы можете просмотреть веб-сайт. Если этот элемент, который вы хотите щелкнуть, содержит тег ID, то лучше указать его:

HTMLDoc.getElementById("SomeFancyID").getElementsByTagName("a")(0).Click

Редактировать:

Насколько так как ошибка в Set HTMLDoc, то постарайтесь свести к минимуму код, насколько это возможно, и отладить оттуда. Попробуйте это:

Sub Something()

    Dim ie As Object
    Dim HTMLDoc As MSHTML.HTMLDocument

    Set ie = CreateObject("InternetExplorer.Application")
    ie.Navigate "https://stackoverflow.com/questions"

    Do While ie.Busy = True Or ie.ReadyState <> 4: DoEvents: Loop
    Set HTMLDoc = ie.Document

    Stop 'Press SHIFT + F9 and examine the window...

End Sub

И как только код остановится в строке Stop, нажмите SHIFT + F9 и осмотрите окно. Там вы увидите все коллекции: enter image description here

0 голосов
/ 10 апреля 2020
getElementsByTagName("a")

возвращает коллекцию тегов

Вам необходимо l oop просмотреть коллекцию и найти нужный (или, если вы точно знаете положение этого тега в DOM, тогда вы можете напрямую получить доступ к этому из коллекции).

Например,

For each a in ie.document.getElementsByTagName("a") 
    If a.ClassName = "whatever_it_is" Then
        a.Click
        Exit For
    Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...