Как выйти из цикла, когда scrollBy достигает нижней части веб-страницы? - PullRequest
0 голосов
/ 01 мая 2018

Я написал скрипт на VBA с использованием IE, чтобы автоматически достичь нижней части веб-страницы. Веб-страница отображает ее содержимое таким образом, что при прокрутке вниз появляется больше продуктов. Я использовал .scrollBy в своем скрипте для обработки ленивой нагрузки.

Я не понимаю, как остановить прокрутку, когда больше нет новых продуктов для загрузки - я использовал .scrollBy в цикле Do. Как выйти из цикла, когда прокрутка завершена и браузер достигает нижней части веб-страницы? Заранее спасибо за любое решение.

Это то, что я пробовал до сих пор:

Sub HandleLazyload()
    Const URL As String = "https://www.inc.com/profile/sumup-payments-limited"
    Dim IE As New InternetExplorer, HTML As HTMLDocument, post As Object

    With IE
        .Visible = True
        .navigate URL
        While .Busy = True Or .readyState < 4: DoEvents: Wend
        Set HTML = .document
    End With

    Do
        HTML.parentWindow.scrollBy 0, 99999
        Application.Wait Now + TimeValue("00:00:03")
        Set post = HTML.getElementsByTagName("article")
    Loop         ''I wish to break out of this loop when all the scrolling is done
    IE.Quit
End Sub

1 Ответ

0 голосов
/ 02 мая 2018

Попробуйте следующее, где я использовал ранг для определения завершения / выхода из цикла.

Option Explicit

Public Sub HandleLazyload()
    Const URL As String = "https://www.inc.com/profile/sumup-payments-limited"
    Dim IE As New InternetExplorer, HTML As HTMLDocument
    With IE
        .Visible = True
        .navigate URL
        While .Busy = True Or .readyState < 4: DoEvents: Wend
        Set HTML = .document
    End With

    Dim rank As Long, item As Long
    item = 1

    Do While Err.Number = 0
        HTML.parentWindow.scrollBy 0, 99999
        Application.Wait Now + TimeSerial(0, 0, 1)
        On Error GoTo errhand
        rank = Split(HTML.querySelectorAll(".rank dt ~ dd")(item).innerText, "#")(1)
        item = item + 1
    Loop

errhand:
    Err.Clear
    Debug.Print "Stopped at rank " & rank

    'Your other code
    'IE.Quit
End Sub

Примечания:

Селектор CSS:

Если вы хотите узнать больше о CSS-селекторе

Селектор ниже нацелен на все элементы, где имя класса равно rank, а затем имеет родственные элементы dt и dd в пределах.

HTML.querySelectorAll(".rank dt ~ dd")(item)

Целевой HTML:

HTML element

...