Как получить определенный элемент из HTML с помощью VBA, используя оболочку селена - PullRequest
0 голосов
/ 16 января 2019

Как я могу вызвать только 8-ю ячейку таблицы из html, используя vba с оболочкой из селена? Я пытаюсь напечатать дату этих изъятий в ячейках в Excel. Вот пример, когда поиск вернул транспортное средство, которое было конфисковано 3 раза с 3 разными датами.

просмотр источника: https://www.autoreturn.com/indianapolis-in/find-vehicle/results

Я пробовал пару различных вариантов .Findelement, таких как

Sheets("VinCheck").Cells(i, "D").Value = chromeDriver.FindElementByClass("input-item").Text

но, похоже, ничего не работает. Это просто возвращает, казалось бы, пустое значение.

1 Ответ

0 голосов
/ 17 января 2019

Вы можете использовать селектор псевдокласса :nth-of-type, чтобы указать номер столбца (nth td ячейка в строке)

Option Explicit
Public Sub SearchVin()
    Dim d As WebDriver, hTable As Object, ws As Worksheet, t As Date
    Dim headers(), vin As String
    Const MAX_WAIT_SEC As Long = 10
    Set d = New ChromeDriver
    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Const URL = "https://www.autoreturn.com/indianapolis-in/find-vehicle/"

    vin = "1G4HD57287U218052"

    With d
        .Start "Chrome"
        .get URL

        .FindElementById("vin").SendKeys vin     '<== vin

        Application.Wait Now + TimeSerial(0, 0, 1)

        .FindElementByCss("[onclick='submitVin()']").Click

        t = Timer
        Do
            DoEvents
            On Error Resume Next
            Set hTable = .FindElementByCss("table")  'use tag name of results table to target table
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop While hTable Is Nothing
        'do something with results
        Dim towDates As Object, towDate As Object
        If Not hTable Is Nothing Then
            Set towDates = .FindElementsByCss("table tr.results-row td:nth-of-type(9)")
            For Each towDate In towDates
                Debug.Print towDate.Text
            Next
        End If
        .Quit
    End With
End Sub

Результаты выглядят так:

image


Ограничительная строка

Вы, конечно, можете добавить еще один селектор nth-of-type, чтобы ограничить также и извлеченную строку. Скажем, вы хотели дату для буксировки для ряда 2:

table tr:nth-of-type(2).results-row td:nth-of-type(9)

image

Обратите внимание, что, поскольку я также использую селектор класса ".", я ограничиваю возвращаемые строки в вышеупомянутых селекторах, чтобы исключить строку заголовка.


Использование последнего ребенка:

Поскольку желаемым столбцом является последняя ячейка td в строке (последний столбец), вместо :nth-of-type, например,

можно использовать селектор псевдокласса :last-child.
Set towDates = .FindElementsByCss("table tr.results-row td:last-child")

и

table tr:nth-of-type(2).results-row td:last-child

Одно возвращаемое значение в сравнении со списком:

Если вы ожидаете одно значение, тогда вы применяете селектор css с помощью

.FindElementByCss

например.

.FindElementsByCss("table tr:nth-of-type(2).results-row td:last-child")

Если вы ожидаете список значений, тогда вы применяете селектор css с помощью

.FindElementsByCss
* * +1058 например,
.FindElementsByCss("table tr.results-row td:last-child")

селектор первого ребенка:

Также стоит отметить, что у вас есть доступ к селектору :first-child, например, для получения первой строки результатов.


Выписка всей таблицы:

Если вы хотите выписать всю таблицу, я отсылаю вас к моему ответу здесь .

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