Как нажать на определенную страницу в сети, используя «нумерацию страниц»? - PullRequest
2 голосов
/ 04 июня 2019

У меня есть процедура, которая открывает веб-страницу и подсчитывает, сколько страниц внутри нее.Тогда мне нужно будет нажать на определенную страницу, например, номер 3. Кто-нибудь знает, как это сделать?Я подробно ниже код макроса.Большое спасибо!

Sub test()

    Dim element As IHTMLElement
    Dim elements As IHTMLElementCollection
    Dim ie As InternetExplorer
    Dim numberOfPages As Double
    Dim html As HTMLDocument

    Set ie = New InternetExplorer
    ie.Visible = True
    ie.navigate "https://cebra.com.ar/category/73/Juego-de-Construccion.html"
    Do While ie.readyState <> READYSTATE_COMPLETE
        Application.StatusBar = "Loading Web page …"
        DoEvents
    Loop
    Set html = ie.document
    Set elements = html.getElementsByClassName("container")
    Set ElementCol = html.getElementsByTagName("a")
    numberOfPages = ie.document.querySelectorAll(".setPage").Length
    'Here I want to click on a certain page, for example, number 3
    For Each ele In ie.document.getElementsByTagName("li")
        For Each element In elements
            If element.className = "container" Then
                'Do something
            End If
        Next element
    Next
    MsgBox "Done"

End Sub

Ответы [ 2 ]

3 голосов
/ 04 июня 2019

Попробуйте следующий код

Option Explicit

Sub test()

    Dim ie As InternetExplorer
    Dim html As HTMLDocument
    Dim element As IHTMLElement

    Set ie = New InternetExplorer
    ie.Visible = True
    ie.Navigate "https://cebra.com.ar/category/73/Juego-de-Construccion.html"
    WaitIE ie
    Set html = ie.Document
    Set element = html.querySelector("a.setPage")
    element.setAttribute "data-value", "3" ' set the page number you want open
    element.click
    WaitIE ie

    MsgBox "Done"

End Sub

Sub WaitIE(ie As InternetExplorer)

    Application.StatusBar = "Loading Web page …"
    Do While ie.readyState <> READYSTATE_COMPLETE
        DoEvents
    Loop
    Application.StatusBar = "Ready"

End Sub
0 голосов
/ 04 июня 2019

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


Пояснение:

Это

currentPage = CLng(.querySelector(".active").innerText)

находит текущую активную страницу. Текущая активная страница имеет атрибут класса со значением active. . - это селектор класса css .

Это

If page <> currentPage Then

игнорирует текущую активную страницу в цикле по всем страницам.

Это

cssSelector = ".setPage[data-value='" & page & "']"

определяет селектор для выбора любой данной страницы путем объединения номера страницы в атрибут data-value. Он комбинируется с селектором класса, ., из setPage для ограничения соответствующими элементами для выбора страницы:

Пример страницы [data-value='pageNumber'], pageNumber, например 2, является атрибутом css attribute = value .

Если вы изучите HTML ниже:

enter image description here

Вы можете видеть, что если текущая активная страница равна 1, то есть значение атрибута класса = active и атрибута data-value нет. Для выбора второй страницы вы можете видеть, что значение класса в настоящее время setPage, а data-value равно 2.

Это

.querySelector(cssSelector).Click

выбирает следующую страницу в цикле.

Это

Do
    On Error Resume Next
    num = CLng(.querySelector(".active").innerText)
    On Error GoTo 0
Loop Until num = page

повторяется до тех пор, пока для выбранного номера страницы не будет активно значение атрибута класса, а его значение innerText = = на нужную страницу, т.е. с выбором страницы 2, когда num = 2, так что html изменяется на:

enter image description here

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


VBA:

Option Explicit

'VBE > Tools > References: Microsoft Internet Controls
Public Sub GetData()
    Dim ie As Object, numberOfPages As Long, currentPage As Long, page As Long
    Set ie = CreateObject("InternetExplorer.Application")
    With ie
        .Visible = True
        .Navigate2 "https://cebra.com.ar/category/73/Juego-de-Construccion.html"

        While .Busy Or .readyState < 4: DoEvents: Wend

        With .document
            numberOfPages = .querySelectorAll(".setPage").Length
            currentPage = CLng(.querySelector(".active").innerText)
            Dim cssSelector As String, num As Long
            For page = 1 To numberOfPages
                If page <> currentPage Then
                    cssSelector = ".setPage[data-value='" & page & "']"
                    .querySelector(cssSelector).Click
                    Do
                        On Error Resume Next
                        num = CLng(.querySelector(".active").innerText)
                        On Error GoTo 0
                    Loop Until num = page
                    While ie.Busy Or ie.readyState < 4: DoEvents: Wend
                End If
            Next
        End With
        .Quit
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...