我如何使用硒包装器从带有VBA的HTML中获取特定元素

时间:2019-01-16 20:57:37

标签: excel vba selenium-chromedriver

我如何使用带有硒包装的vba从html中仅调用表格的第8个单元格?我正在尝试将这些扣押的日期打印到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 :(得分:2)

您可以使用: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

结果如下:


限制行

您当然可以添加另一个nth-of-type选择器来限制检索到的行。假设您想要第2行的拖曳日期时间,

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

请注意,由于我也在使用类"."选择器,因此我限制了上述选择器中返回的行以排除标题行。


使用最后一个孩子:

由于所需的列是行(最后一列)中的最后一个td单元,因此您可以使用:last-child伪类选择器来代替:nth-of-type,例如

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

例如

.FindElementsByCss("table tr.results-row td:last-child")

第一个孩子选择器:

还值得注意的是,您可以访问:first-child选择器,例如,获取第一行结果。


写出整个表格:

如果您想写出整个表格,请参考答案here