Как посчитать элементы из класса с VBA + SELENIUM в хром? - PullRequest
1 голос
/ 21 мая 2019

Я хочу посчитать количество элементов с целью получить все их имена и сохранить их в массиве.

Имена выделены на этом изображении

Именахранятся в "js-list list-wrapper" , как показано на изображении

Мой код:

  Public Sub seleniumtutorial()
  Dim bot As New SeleniumWrapper.WebDriver
  Dim a As WebElement
  Dim b As WebElement
  Dim x() As Integer

  bot.Start "chrome", "https://trello.com/login"
  bot.get "/"

  bot.Type "name=user", "biaverly@id.uff.br"
  bot.Type "name=password", "carambola69"
  bot.clickAndWait "id=login"
  bot.findElementByLinkText("Gestão de Pessoas").Click

Я пытался:

  Set a = bot.findElementsByClassName("board-canvas", 5).Count

и найти элементы по xpath и id.

Ответы [ 3 ]

0 голосов
/ 21 мая 2019

Предостережение: ниже для селена основной VBA. Он использует библиотеку типов Selenium и основан на разработке @ florentbr с здесь . Синтаксис, который вы используете, заставляет меня думать, что вопрос потенциально помечен неверно, поскольку синтаксис, по большей части, предназначен для Селен IDE . Не уверен, что вы конвертируете скрипт? Я не помню, чтобы VBA был поддерживаемым языком для IDE, но ......


Заголовками Trello будет имя класса list-header-name.

Я бы использовал быстрее .FindElementsByCss

Итак,

bot.FindElementsByCss(".list-header-name")

"." перед list-header-name находится селектор класса css . Современные браузеры оптимизированы для этого.


,5 - это значение для аргумента minimum; так как вы не использовали именованные аргументы, сопоставление будет позиционным. Третий аргумент будет timeout. И minimum, и timeout являются необязательными.


Теперь, когда используется ключевое слово Set, это для присвоения переменной объекта:

Dim titles As Object
Set titles = bot.FindElementsByCss(".list-header-name")

Вы не пытаетесь получить свойство одновременно. Попытка:

Set titles = bot.FindElementsByCss(".list-header-name").Count

должно привести к несоответствию типов ошибка.

Вы можете отдельно взять счетчик webElement из коллекции с помощью

Dim numberOfWebElements As Long
numberOfWebElements = titles.Count

Для trello есть идентификаторы, которые вы можете использовать для входа в систему. Я бы использовал их и метод SendKeys


Пример схемы:

Option Explicit

Public Sub SeleniumTutorial()
    Dim bot As WebDriver, titles As Object, i As Long
    Dim numberOfWebElements As Long, names(), t As Date
    Const MAX_WAIT_SEC As Long = 10

    Set bot = New ChromeDriver

    With bot
        .get "https://trello.com/login"
        .Window.Maximize
        .FindElementById("user").SendKeys "userName"
        .FindElementById("password").SendKeys "passWord"
        .FindElementById("login").Click
        .FindElementByLinkText("Gestão de Pessoas", timeout:=5000).Click  '< named argument

        t = Timer
        Do
            On Error Resume Next
            Set titles = bot.FindElementsByCss(".list-header-name")
            numberOfWebElements = titles.Count
            On Error GoTo 0
            If Timer - t > MAX_WAIT_SEC Then Exit Do
        Loop While numberOfWebElements = 0

        If numberOfWebElements = 0 Then Exit Sub

        ReDim names(1 To numberOfWebElements)

        For i = 1 To titles.Count
            names(i) = titles.item(i).Text
        Next

        Stop 'delete me later

    End With
End Sub
0 голосов
/ 21 мая 2019

Я получил xpath от случайного элемента в классе "js-list list-wrapper", и он был: //*[@id="board"]/div[5].

Итакя решил это используя

 Dim titles As Object
 Set titles = 
 bot.findElementsByXPath("//[@id=""board""]/div")
 Dim ab As Long
 ab = titles.Count
 MsgBox ab
0 голосов
/ 21 мая 2019

findElementsByClassName определенно то, что вы хотите, но ваше использование выглядит неправильно.Я почти уверен, что .count возвращает длинный, а не веб-элемент или массив веб-элементов.Я также почти уверен, что второй параметр не требуется, что вы пытаетесь выполнить с помощью , 5 и каково было ваше сообщение об ошибке?

Чтобы получить число элементов в этом классе

Dim classCount as Long
classCount = bot.findElementsByClassName("board-canvas").Count

Ссылаясь на последний элемент в этом классе

bot.findElementsByClassName("board-canvas").Item(classCount)

Содержимое последнего элемента в этом классе

bot.findElementsByClassName("board-canvas").Item(classCount).Text

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

Dim classTxt as String
Set a = bot.findElementsByClassName("board-canvas")
For each b in a
classTxt = b.Text
Next b
...