【问题标题】:How can I find the content of an HTML element found with XPath (Selenium with VBA)如何找到使用 XPath 找到的 HTML 元素的内容(Selenium with VBA)
【发布时间】:2020-08-31 04:48:08
【问题描述】:

我正在寻找一种从网站获取名为“data-testid”的元素内容的方法。该元素在 HTML 代码中具有不同内容的不同上下文中存在大约 35 次。 我正在寻找的类似 [data-testid="############-follow"],其中 ######## 是改变号码。 我正在将 Excel VBA 与 Selenium 一起使用,以便与 Chrome 浏览器一起使用。 代码相对简单,大部分都在工作,但我无法获得这个特定的内容。 我打开一个网页,查找具有此名称的元素,然后扫描所有找到的元素(如果它们包含“follow”一词)。找到后,我会提取该单词之前的数字并将其存储在 Excel 工作表中。

Set d = New ChromeDriver
d.Start "Chrome"

Set Rng = Range(Worksheets("followers").Range("A2"), Worksheets("followers").Range("A2").End(xlDown))

For Each Cell In Rng
    If Cells(Cell.Row, 2).Value2 = "" Then
        user = Cell.Value2
        user = Replace(user, "@", "", 1, 1)         'remove "@"
        d.Get "https://twitter.com/" & user         'navigate to user's page.
        Set Result = d.FindElementsByXPath("//div[@data-testid]")
        If Result.Count > 0 Then
            For i = 1 To Result.Count
                n = InStr(Result(i).Text, "-follow")
                If n > 0 Then Exit For
            Next
            Cells(Cell.Row, 2).Value2 = Left(Result(i).Text, n - 1)
        End If
    End If
Next

这是 HTML 的末尾包含所需元素的部分:

<div role="button" data-focusable="true" tabindex="0" class="css-18t94o4 css-1dbjc4n r-1niwhzg r-p1n3y5 r-sdzlij r-1phboty r-rs99b7 r-1w2pmg r-1vuscfd r-1dhvaqw r-1ny4l3l r-1fneopy r-o7ynqc r-6416eg r-lrvibr" data-testid="1197328651785789440-follow">

结果 [Result(1...35)] 的每一项都列出了 4 个布尔属性和一种字符串类型,当我检查它时,字符串总是标签名称“div”。没有显示其他属性。一次偶然的机会,我尝试了属性“Text”[Result(i).Text],它给出了页面中的一些文本,但 35 个元素中没有一个显示预期的内容。

由于我对 Selenium 的经验很少,我需要帮助来了解如何提取此元素的内容 谢谢

【问题讨论】:

    标签: html vba selenium xpath


    【解决方案1】:

    使用以运算符结尾的 css 属性选择器

    .FindElementByCss("[data-testid$='-follow']")
    

    我用几种语言写过,略有不同。如果上述不是 selenium basic 方法的准确拼写,您可以实例化一个 webdriver 实例,如果上述内容略有偏差,它应该会显示正确的拼写。

    这以节点的属性和属性值为目标,因此不需要循环。

    使用匹配节点上的 .attribute("data-testid") 属性来访问属性值。

    【讨论】:

    • 您可以在 [ 前面添加 div 更具体或添加更多属性,但希望以上内容足够具体。
    • 它是在 iframe 内还是被其他元素遮挡?如果您在该行之前等待是否找到?
    • 感谢您的提示。它恰好找到了 1 个元素,但是 Result(1).Text = "Seguir",它不是这个元素的内容,而是按钮的文本字符串,在这个节点的下方找到。它比我之前的搜索更精确(1 个结果而不是 35 个)。所以现在的问题是,Result(1) 是否有任何(隐藏的)属性可以提供该元素的内容?通常,我可以通过在 VBA 调试器中检查对象的属性树来查看它,但甚至没有列出“文本”,尽管它显然存在。其他属性的任何想法? “内容”不起作用。
    • Findelement 应该匹配第一个节点。如果您在浏览器元素选项卡 (F12) 中使用查找框 Ctrl + F,并输入 css 选择器,“”之间的位,当您按 Enter 时返回多少个匹配项?在我的个人资料页面上我通常共享的链接部分列出了如何执行此操作的示例。
    • 据我了解,“结果”并不是我要搜索的元素,而是整个节点。这可以解释它的属性之一是“tagname”,它以“div”的形式给出,并且“Text”属性返回在该节点更下方找到的字符串(“Seguir”)。所以我需要解决我正在寻找的元素,或者获取这个节点的整个代码,这样我就可以搜索子字符串“follow”。
    【解决方案2】:

    感谢 QHarr,我现在找到了完美的解决方案。我希望,这也可以帮助其他人,所以我在这里描述它。 首先,我将搜索更改为 .FindElementsByCss("[data-testid$='-follow']")。 由于搜索元素的更好规范,这给出了准确的 ONE 结果(而不是之前的 35 个)。元素名称后的“$”符号表示后面的参数是部分字符串,因此它会查找任何参数包含“-follow”的“data-testid”。本文档中只有一个。 然后我把 FindElements 改成了 FindElement,因为现在只剩下一个了。 然后我在搜索中添加了“.Attribute("data-testid")”:

    a = d.FindElementByCss("[data-testid$='follow']").Attribute("data-testid")
    

    结果不再是对象“Result”,而是我正在寻找的字符串。 其余的很容易。 非常感谢 QHarr!

    【讨论】:

    • $ 是运算符的结尾。表示要匹配的子字符串必须在属性值的末尾。
    • 好的,谢谢。我误解了。在哪里可以找到有关这些运营商的信息?
    • 参见属性选择器
    • 在 GitHub 上,您可以下载 selenium basic 附带的示例 excel 文件。 GitHub 页面的问题日志也是一个很好的来源。如果你已经包含了对 selenium 类型库的引用,你还应该有带有早期绑定 webdriver 实例的智能感知。有任何问题欢迎随时提问。
    猜你喜欢
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多