Как нажать кнопку на веб-странице, используя <td>и <tr>? - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь нажать на первую кнопку «Завершено» в выделенной части веб-страницы ниже.enter image description here

Вот фрагмент кода vba страницы сайта: enter image description here

Я пытался нажать на FIRST завершил кнопку разными способами, такими как:

    For Each element In ie3.getElementsByTagName("main_table_data_right_border main_table_data_bottom_border")(5)
  If element.innerText = "Completed" Then
  ' Application.Wait (Now + TimeValue("0:03:00"))
    element.Click
     Application.Wait (Now + TimeValue("0:00:20"))
      Exit For
        Else
    End If
Next

или

doc.querySelector("#divPage > table.advancedSearch_table > tbody"). _ getElementsByTagName("tr")(3).getElementsByTagName("td")(5).Children(0).Click

Но, похоже, ни один из них не работает.Когда я отлаживаю код и прохожу эту часть и эту конкретную строку, на самом деле ничего не происходит.Таким образом, кнопка не нажимается.

Кто-нибудь может мне помочь с этим?

Большое спасибо!:)

Ответы [ 3 ]

1 голос
/ 04 июля 2019

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

VBA-код для поиска гиперссылки и нажатия кнопки (в этом примере я просто нахожу специальную ячейку в первой строке, если вы хотите перебрать гиперссылку, вам нужно использовать оператор For Each для циклического перемещения по массиву ).

Sub Test()
    Dim ie As Object
    Dim Rank As Object
    Set ie = CreateObject("InternetExplorer.application")
    ie.Visible = True
    ie.Navigate ("http://localhost:54382/HtmlPage47.html")
    Do
        If ie.ReadyState = 4 Then
            Exit Do
        Else
        End If
    Loop

    Set doc = ie.document

    doc.getElementsByTagName("tr")(1).getElementsByTagName("td")(5).getElementsByTagName("a")(0).Click

End Sub

Код на веб-странице:

<div>
    <table class="main_table" style="text-align:center;">
        <tr class="main_table_header">
            <td></td>
            <td>Export Type</td>
            <td>Criteria</td>
            <td>Rep./List</td>
            <td>Creation Date</td>
            <td>Status</td>
            <td>Reference</td>
        </tr>
        <tr class="main_table_data">
            <td>
                <input id="Checkbox1" type="checkbox" />
            </td>
            <td>Activites</td>
            <td>Process Date from 2019/07/02 to 2019/07/02</td>
            <td>For an advanced search</td>
            <td>2019/07/03</td>
            <td><a onclick="javascript:alert('hello AA')" id="link1" href="#">Conpleted</a> (601 lines)</td>
            <td>662602308</td>
        </tr>
        <tr class="main_table_data">
            <td>
                <input id="Checkbox1" type="checkbox" />
            </td>
            <td>Activites</td>
            <td>Process Date from 2019/07/02 to 2019/07/02</td>
            <td>For an advanced search</td>
            <td>2019/07/03</td>
            <td><a onclick="javascript:alert('hello BB')" href="#">Conpleted</a> (601 lines)</td>
            <td>662602308</td>
        </tr>
        <tr class="main_table_data">
            <td>
                <input id="Checkbox1" type="checkbox" />
            </td>
            <td>Activites</td>
            <td>Process Date from 2019/07/02 to 2019/07/02</td>
            <td>For an advanced search</td>
            <td>2019/07/03</td>
            <td><a onclick="javascript:alert('hello CC')" href="#">Conpleted</a> (601 lines)</td>
            <td>662602308</td>
        </tr>
        <tr class="main_table_data">
            <td>
                <input id="Checkbox1" type="checkbox" />
            </td>
            <td>Activites</td>
            <td>Process Date from 2019/07/02 to 2019/07/02</td>
            <td>For an advanced search</td>
            <td>2019/07/03</td>
            <td><a onclick="javascript:alert('hello DD')" href="#">Conpleted</a> (601 lines)</td>
            <td>662602308</td>
        </tr>
    </table>
</div>

Результат такой.

enter image description here

0 голосов
/ 11 июля 2019

Я вижу, вы немного сбиты с толку относительно того, как получить доступ к элементам HTML, поэтому я воспользуюсь этой возможностью, чтобы продемонстрировать логику этого очень подробным образом, который я также считаю очень интуитивным.Есть и другие способы сделать это, но я считаю, что следующий является наиболее полным и интуитивно понятным и идеальным для начинающего.

Во-первых, я пойду дальше и предположу, что ie3 - это InternetExplorerобъект.

Когда вы используете этот объект для перехода на страницу, вы можете получить доступ к html этой странице, используя ie3.document, который содержит HTML document объект.

Чтобы воспользоваться всеми преимуществамиобъекта HTML document вы должны добавить ссылку на Microsoft HTML Object Library.Эта библиотека позволит вам использовать ряд элементов HTML, которые облегчат вашу жизнь.

В вашем случае, элементы, к которым вы хотите иметь доступ, представляют собой

  1. HTML-таблицы и их строки и ячейки
  2. HTML-якорные элементы ()

Итак, мои объявления будут следующими:

Dim ie3 As New InternetExplorer 'To be used to navigate to the page of interest
Dim doc As HTMLDocument 'this will hold the HTML document corresponding to the page
Dim toBeClicked As HTMLAnchorElement 'To be used to store the <a></a> element
Dim table As HTMLTable 'To be used to store the table element
Dim tableRow As HTMLTableRow 'To be used to store a row of the table element
Dim tableCell As HTMLTableCell 'To be used to store a cellof the table element

Предполагая, что вы уже использовали ie3 для перехода на интересующий сайт, вы можете сохранить его HTML-документ в doc вот так:

Set doc = ie3.document

Получив доступ к HTML-документу веб-страницы, вы также можете получить доступ к его элементам несколькими способами, некоторые из которых более целенаправленные, чем другие.Ниже я демонстрирую наиболее распространенные методы для этого, используя в качестве примера элемент таблицы.

  1. Если таблица имеет уникальный идентификатор, вы можете получить к ней доступ, используя .getElementById() метод.Этот метод возвращает один элемент.В вашем случае таблица, к которой вы стремитесь, не имеет идентификатора.

  2. Если таблица принадлежит классу, вы можете получить к ней доступ, используя .getElementsByClassName()метод.Этот метод возвращает набор элементов, каждый из которых принадлежит одному и тому же классу.Чтобы получить доступ к участнику этой коллекции, вы можете использовать обозначение (item index).Первый член имеет индекс 0.В вашем случае таблица относится к классу "advancedSearch_table", который имеет только одного члена.

  3. Если нет класса или идентификатора, вы можете использовать метод .getElementsByTagName.Этот метод возвращает набор всех элементов, имеющих одинаковый тег.В вашем случае вам понадобятся все таблицы в документе.Чтобы получить доступ к участнику этой коллекции, вы можете использовать обозначение (item index).Первый член имеет индекс 0.Теги в HTML выглядят так <tagName attribute="something">Something</tagName>.

Ниже я продемонстрирую все три метода.Вы можете использовать любой из первых двух:

Set table = doc.getElementsByClassName("advancedSearch_table")(0)
Set table = doc.getElementsByTagName("table")(0)
Set table = doc.getElementById("ID of the table") 'only for demostration purposes, it doesn't apply to your case, as the table has no ID.

Имейте в виду, что в вашем случае в документе только одна таблица и только один элемент принадлежит классу "advancedSearch_table".Это означает, что вам нужен первый элемент соответствующих коллекций.Вот почему я использую 0 в качестве индекса.

По той же логике, что и выше, теперь, когда таблица сохранена, вы можете получить доступ к ее строкам и ячейкам.Точнее, вам нужна 5-я ячейка 4-го ряда.Вот где вы хотите перейти по ссылке:

Set tableRow = table.getElementsByTagName("tr")(3)
Set tableCell = tableRow.getElementsByTagName("td")(4)

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

Set toBeClicked = tableCell.getElementsByTagName("a")(0)
toBeClicked.Click

БОНУС

Если вы хотитенажмите на все ссылки «Завершено», одну за другой, вам нужно перебрать соответствующие элементы.Вот два способа сделать это:

Нажмите на якорь в 5-й ячейке каждой строки:

For Each tableRow In table.Rows
    Set toBeClicked = tableRow.getElementsByTagName("td")(4).getElementsByTagName("a")(0)
    toBeClicked.Click
Next tableRow

Переберите все строки и, хотя и во всех ячейках таблицы, найдитевнутренний текст, который вы ищете, и нажмите на соответствующую ссылку:

For Each tableRow In table.Rows
    For Each tableCell In tableRow.Cells
        If tableCell.innerText = "Something" Then
            Set toBeClicked = tableCell.getElementsByTagName("a")(0)
            toBeClicked.Click
    Next tableCell
Next tableRow
0 голосов
/ 03 июля 2019

Здесь, когда вы нажмете завершенную гиперссылку, Java-скрипт будет запущен и откроет файл Excel, здесь вы можете использовать ie3.Navigate "javascript:openExcelFile('t83_Kerrfinancialadvisorsinc/455X3/ExportActivity_66260230820190703122002139.xlsx)"

, поскольку он связан с гиперссылкой, вы также можете попробовать использовать

element.Click
element.FireEvent ("onclick") 

или вы можете использовать execscript

Call ie3.document.parentWindow.execScript("your script in webpage", "JavaScript")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...