Используя VBA & IE мне нужно нажать на определенный текст на странице - PullRequest
0 голосов
/ 24 октября 2019

Вот HTML-код, который я вижу, и часть макроса и цели:

<a class="Ligne0 OrderNo" style="width: 100%; height: 100%; display: block;">20190180963865</a>

    MsgBox IE.document.Url
    Dim element As IHTMLElement
    Dim elements As IHTMLElementCollection
    Dim HTML As HTMLDocument

    Set HTML = IE.document

    Set elements = HTML.getElementsbyclassname("Ligne0 OrderNo")

    Dim Count As Long
    Dim erow As Long
    Dim BOO

    Count = 0

    For Each element In elements

        If element.classname = "Ligne0 OrderNo" Then

            erow = Sheet2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

            Cells(erow, 1) = HTML.getelementsbytagname("a")(Count).innertext

            BOO = HTML.getelementsbytagname("a")(Count).innertext

            Count = Count + 1

        End If

    Next element

    Range("A2:B11").Select
    Columns("A:A").EntireColumn.AutoFit
    Columns("B:B").ColumnWidth = 36

    MsgBox BOO

End Sub

Класс Ligne0 OrderNO является уникальным в теле. Мне нужно провести перекрестную проверку «20190180963865» с созданным мною массивом, и при обнаружении я смогу щелкнуть элемент, который перенесет меня на другую страницу.

Что я пробовал: ** MSGBOX.ie.document.url дает мнеправильный URL. Я обрезал верхнюю часть макроса здесь, чтобы сэкономить место.

MSGBOX BOO должен дать мне «20190180963865», но вместо этого ничего не даст. Я добавил .innertext и .value, но затем msgbox просто не появляется.

, затем с помощью BOO я хочу иметь возможность .click текст в IE

** Я уже проверилoff "ссылки на элемент управления Microsoft Internet" и "библиотека объектов Microsoft HTML"

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Вам не нужен цикл, и класс уже предназначен для интересующего тега a, поэтому вы не хотите пытаться выбирать по tagName, когда он уже на нужном уровне. querySelector возвращает один узел;первый узел, соответствующий указанному селектору, который в данном случае является составным className для интересующего элемента (составные классы объединяются знаком «.», а «.» представляет селектор класса css).

Dim BOO As String, element As Object

Set element = HTML.querySelector(".Ligne0.OrderNo")

If Not element Is Nothing Then
    BOO = element.innerText
    'do whatever else when element is found
End If
0 голосов
/ 24 октября 2019

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

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

Код VBA:

Sub demo()

    Dim i As Long
    Dim URL As String
    Dim IE As Object

    Set IE = CreateObject("InternetExplorer.Application")

    IE.Visible = True

    URL = "D:\Backup20190913\tests\295.html"

    IE.Navigate URL


    Do While IE.readyState = 4: DoEvents: Loop   'Do While
    Do Until IE.readyState = 4: DoEvents: Loop   'Do Until

    Set Alllinks = IE.document.getElementsByTagName("A")

    For Each Hyperlink In Alllinks
        If Hyperlink.innerText = "20190180963865" And Hyperlink.className = "Ligne0 OrderNo" Then
            Hyperlink.Click


        End If
    Next Hyperlink

    'Unload IE
    'Set IE = Nothing


End Sub

Пример кода HTML:

<!doctype html>
<html>
<head>
<script>
function abc()
{
alert("clicked...");
}
</script>
</head>
<body>
<a class="Ligne0 OrderNo" style="width: 100%; height: 100%; display: block;" onclick="abc()">20190180963865</a>

</body>
</html>

Вывод:

enter image description here

Кроме того, вы можете изменить свой пример в соответствии со своими требованиями. вам просто нужно извлечь ваши значения из листа и сопоставить их в приведенном выше коде.

Сообщите нам, если у вас возникнут трудности с применением этого предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...