如何在 chrome 中用 VBA + SELENIUM 计算 class 中的元素?

How to count the elements from a class with VBA + SELENIUM in chrome?

我想计算元素的数量,目的是获取所有元素的名称并存储在一个数组中。

名称已突出显示in this image

名称存储在“js-list list-wrapper”中as shown in image

我的代码:

  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", "xxxxxxx"
  bot.clickAndWait "id=login"
  bot.findElementByLinkText("Gestão de Pessoas").Click

我试过了:

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

并通过 xpath 和 id 查找元素。

findElementsByClassName 绝对是你想要的,但你的用法看起来不对。我很确定 .count returns 很长,而不是网络元素或网络元素数组。我也很确定它不需要第二个参数,你想用 , 5 完成什么,你的错误消息是什么?

获取 class

中元素的数量
Dim classCount as Long
classCount = bot.findElementsByClassName("board-canvas").Count

指的是 class

中的最后一个元素
bot.findElementsByClassName("board-canvas").Item(classCount)

那个class

中最后一个元素的内容
bot.findElementsByClassName("board-canvas").Item(classCount).Text

现在,不幸的是,这是我可能偏离路线的地方,因为我没有我的作品可供参考,但我相信你可以像这样检索集合并循环遍历 class

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

警告:以下是基本硒 vba。这使用了 Selenium 类型库,并且基于来自 here. The syntax you are using makes me think the question potentially is wrongly tagged as the syntax, for the most part, is for selenium IDE 的@florentbr 的开发。不确定您是否正在转换脚本?我不记得 VBA 是 IDE 支持的语言,但是......


Trello headers 将是 class 名称 list-header-name

我会用得更快.FindElementsByCss

所以,

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

“.”在 list-header-name 之前是一个 css class selector。现代浏览器为此进行了优化。


,5minimum 参数的值;由于您没有使用命名参数,因此匹配将是位置性的。第三个参数是 timeoutminimumtimeout 都是可选的。


现在,当使用 Set 关键字时,这是为了分配给 object 变量:

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

您没有尝试同时检索 属性。正在尝试:

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

应该会导致类型不匹配错误。

您可以使用

分别从 collection 中获取 webElement 计数
Dim numberOfWebElements As Long
numberOfWebElements = titles.Count

对于 trello,您可以使用 ID 进行登录。我会使用那些和 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

我从 class "js-list list-wrapper" 中的一个随机元素得到了 xpath,它是: //*[@id="board"]/div[5].

所以我用

解决了它
 Dim titles As Object
 Set titles = 
 bot.findElementsByXPath("//[@id=""board""]/div")
 Dim ab As Long
 ab = titles.Count
 MsgBox ab