SeleniumBasi c VBA Fastest L oop WebElements с использованием метода WebElement - PullRequest
0 голосов
/ 04 апреля 2020

Я заметил довольно продолжительное время для завершения операции.

Я использую последнюю версию SeleniumBasi c для VBA для извлечения данных из таблицы с помощью ChromeDriver. (https://github.com/florentbr/SeleniumBasic)

Я извлекаю WebElements и перебираю их, чтобы получить текстовое значение.

Я присваиваю текстовое значение массиву типа Строка.

Эта операция занимает довольно много времени, когда у меня большой массив (1000 объектов WebElement).

Вопрос - Какой самый быстрый способ получить все текстовые значения ?

Вот мой HTML

<table class="Tables_Table_0">
    <caption></caption>
    <thead class="thead-inverse">
        <tr>
            <th class="col-md-4">
                Name
            </th>
            <th class="text-center">
                Time
            </th>
            <th class="text-center">
                Number
            </th>
            <th class="text-center">
                Rate
            </th>
            <th class="text-center">
                Other
            </th>
            <th class="text-center">
                Final
            </th>

        </tr>
    </thead>

    <tbody>
        <tr class="SOME CLASS">
            <td>
                Name Here</a>
            </td>
            <td class="text-center">
                123.000
            </td>
            <td class="text-center">
                5
            </td>
            <td class="text-center">
                8%
            </td>
            <td class="text-center">
                20
            </td>
            <td class="text-center">
                300.00
            </td>
        </tr>
    </tbody>
</table>

Каждая строка таблицы имеет 6 точек данных, указанных в теге td. Я сократил фрагмент только до одной строки таблицы, но только представьте, что у вас есть более 100 строк таблицы.

Код VBA

Dim table As WebElement, tableElements As WebElements, tableData() As String, Element
Dim tableIndex As Integer, tableDataCount As Integer

'Get the table
Set table = bot.FindElementByXPath("//*[@id=""Tables_Table_0""]")

'Get the <td> elements
Set tableElements = table.FindElementsByTag("td")

'Assign array size to variable to use later on during loops
tableDataCount = tableElements.Count

'Assign array size            
ReDim tableData(tableDataCount)

'Loop index counter       
tableIndex = 1

'PROBLEM HERE - TAKES TOO LONG WHEN I HAVE A BUNCH OF ROWS IN MY TABLE
'Loop each element and get the Text value            
For Each Element In tableElements
    tableData(tableIndex) = Element.text '
    tableIndex = tableIndex + 1
Next Element

1 Ответ

0 голосов
/ 04 апреля 2020

После еще нескольких исследований есть объект TableElement, который можно использовать. Это почти мгновенно извлекает HTML таблиц и выводит их в двумерный массив VBA.

'Credits to @florentbr 
Private Sub Iterate_A_Table2()
Dim driver As New FirefoxDriver, Assert As New Assert
driver.Get "http://the-internet.herokuapp.com/tables"

Dim tbl As TableElement
Set tbl = driver.FindElementByCss("#table1").AsTable

Dim Data()
Data = tbl.Data
For c = 1 To UBound(Data, 1)
  For r = 1 To UBound(Data, 1)
    Debug.Print Data(r, c)
  Next
  Debug.Print Empty
Next

driver.Quit
End Sub

Кредиты @florentbr -

https://github.com/florentbr/SeleniumBasic/issues/33#issuecomment -153500008

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