Как получить текст <h2> из <div>с помощью VBA Selenium в Chrome и вставить дату в электронную таблицу? - PullRequest
0 голосов
/ 12 февраля 2019

Я изучаю VBA для проекта, и у меня возникают проблемы с извлечением определенных элементов из html и заполнением их в электронной таблице Excel.

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

Вот мой VBA-код:

Option Explicit

Public Sub GrabShipping()

    Dim t As Date

    Dim ele As Object

    Dim driver As New ChromeDriver

    Dim post As WebElement

    Dim i As Integer

    Dim mysheet As Worksheet


    Const MAX_WAIT_SEC As Long = 10
    Const INURL = "https://ss3.shipstation.com/#/dashboard"
    Const URL = "https://ss3.shipstation.com/"

    Set mysheet = Sheets("Main")

    With driver
        .Start "Chrome"
        .get URL
        t = Timer
        Do
            On Error Resume Next
            Set ele = .FindElementById("username")
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop While ele Is Nothing
        If ele Is Nothing Then Exit Sub
        ele.SendKeys "Username"
        .FindElementById("password").SendKeys "Password"
        .FindElementById("btn-login").Click
     End With

     With driver
        .get INURL

        i = 2
        For Each post In driver.FindElementsByXPath("//div[contains(@class,'row-fluid stats')]")
            mysheet.Cells(i, 1) = post.FindElementByXPath(".//*[following-sibling:[contains(text(),'New Orders'").Attribute("New Orders")
            mysheet.Cells(i, 2) = post.FindElementByXPath(".//*[following-sibling:[contains(text(),'Ready to Ship'").Attribute("Ready to Ship")
            mysheet.Cells(i, 3) = post.FindElementByXPath(".//*[following-sibling:[contains(text(),'Orders Shipped'").Attribute("Orders Shipped")
        Next post


        Stop               '<==delete me later
        .Quit


    End With


End Sub

Вот HTML-код, из которого я пытаюсь получить:

<div class="header row-fluid"><div class="row-fluid stats">
    <div class="col-sm-4 col-md-4 col-lg-4">
        <h2>2,318</h2>
        New Orders
    </div>
    <div class="col-sm-4 col-md-4 col-lg-4">
        <h2>53</h2>
        Ready to Ship
    </div>
    <div class="col-sm-4 col-md-4 col-lg-4">
        <h2>2,265</h2>
        Orders Shipped
    </div>
</div></div>

Я ожидаю, что он вернет значенияв s к моей электронной таблице, но в настоящее время, когда я запускаю код, он ничего не добавляет.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Вы можете использовать комбинацию селектора css

Dim item As Object, nodeList As Object, r As Long
Set nodeList = driver.findElementsByCss(".col-sm-4.col-md-4.col-lg-4 h2")
For each item in nodeList
    r = r + 1
    Activesheet.Cells(r,1) = item.text
Next

Вы можете попробовать повторно использовать синхронизированный цикл

 Dim item As Object, nodeList As Object, r As Long
 t = Timer
 Do
     Set nodeList = driver.FindElementsByCss(".col-sm-4.col-md-4.col-lg-4 h2")
     If Timer - t > MAX_WAIT_SEC Then Exit Do
 Loop While nodeList.Count = 0
 If nodeList.Count > 0 Then
     For Each item In nodeList
         r = r + 1
         ActiveSheet.Cells(r, 1) = item.Text
     Next
 End If

Я бы порекомендовал посмотреть, если вы можетесократить селектор CSS, например, до:

.col-sm-4 h2
0 голосов
/ 12 февраля 2019

Вы можете идентифицировать <h2> текст узла, используя следующий xpath:

//div[contains(@class,'row-fluid stats')]/div/h2

Но вы можете получить несколько совпадений, поскольку для предоставленного класса есть несколько тегов <h2>.

Поскольку вы выполняете цикл, я предполагаю, что цикл будет извлекать значения одно за другим из списка, чтобы вы могли изменить свой

i = 2
For Each post In driver.FindElementsByXPath("//div[contains(@class,'row-fluid stats')]")
    mysheet.Cells(i, 1) = post.FindElementByXPath(".//*[following-sibling:[contains(text(),'New Orders'").Attribute("New Orders")
    mysheet.Cells(i, 2) = post.FindElementByXPath(".//*[following-sibling:[contains(text(),'Ready to Ship'").Attribute("Ready to Ship")
    mysheet.Cells(i, 3) = post.FindElementByXPath(".//*[following-sibling:[contains(text(),'Orders Shipped'").Attribute("Orders Shipped")
Next post

, как показано ниже:

i = 2
j = 1
For Each post In driver.FindElementsByXPath("//div[contains(@class,'row-fluid stats')]/div/h2")
    mysheet.Cells(i, j) = post.FindElementByTag("h2").Text
    j = j + 1
Next post

Если код вышене работает, попробуйте следующий код, который попытается получить этот текст, используя имя класса и имя тега:

i = 2
j = 1
For Each post In driver.FindElementsByClass("row-fluid stats")
    mysheet.Cells(i, j) = post.FindElementByTag("h2").Text
    j = j + 1
Next post

Надеюсь, это поможет ...

0 голосов
/ 12 февраля 2019

Вместо

post.FindElementByXPath(".//*[following-sibling:[contains(text(),'New Orders'").Attribute("New Orders")

Не могли бы вы попробовать приведенный ниже код и сообщить мне, если это поможет.

post.FindElementByXPath("//div[@class='row-fluid stats']/div/h2").Text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...