excel - 没有此类元素错误。使用 VBA 找不到 XPath 的元素
问题描述
我正在尝试从tipranks.com 上的股票中提取分析师的建议
我有一个电子表格来放置对股票提出买入、持有和卖出建议的分析师数量。我使用 Selenium 和 ChromeDriver 打开网站,然后找到值(每个建议的分析师数量)并复制到电子表格中。
代码在尝试复制第一个值之前一直有效。它说它找不到元素。
“未找到 XPath [XPath 方向] 的元素”
如果我在代码因错误而暂停时复制完整的 XPath,从程序打开的 Chrome 窗口中再次粘贴并单击继续,则程序将顺利运行,并会在网站上找到其余元素尽管 XPath 与我之前使用的相同。
问题似乎是当我运行程序时它试图找到第一个 XPath 元素时,不管我试图找到的元素是什么,一旦我解决了它就会找到其余的元素。
Dim obj As New WebDriver
Dim xyz As WebElement
Dim destino As Range
obj.Start "chrome", ""
obj.Get "https://www.tipranks.com/stocks/aapl/forecast"
Application.Wait (Now + TimeValue("0:00:5"))
Dim BUYs As Range
Set BUYs = ActiveCell
BUYs = obj.FindElementByXPath("/html/body/div[1]/div/div/div[2]/article/div[2]/div/main/div[1]/section/div[2]/div[1]/div[2]/div/div[2]/div/ul/li[1]/span[2]/b").Text
ActiveCell.Offset(0, 1).Select
Set HOLDs = ActiveCell
Dim HOLDs As Range
HOLDs = obj.FindElementByXPath("/html/body/div[1]/div/div/div[2]/article/div[2]/div/main/div[1]/section/div[2]/div[1]/div[2]/div/div[2]/div/ul/li[2]/span[2]/b").Text
ActiveCell.Offset(0, 1).Select
Dim SELLs As Range
Set SELLs = ActiveCell
SELLs = obj.FindElementByXPath("/html/body/div[1]/div/div/div[2]/article/div[2]/div/main/div[1]/section/div[2]/div[1]/div[2]/div/div[2]/div/ul/li[3]/span[2]/b").Text
解决方案
我无法在 VBA 中进行测试,但以下是来自 python 的翻译,其中我使用 css 选择器来定位所需的元素。我以父节点为目标,这样我就可以按空间分割以生成描述和值,例如购买 19。这应该可以避免 xpath 出现的问题。
Dim items As WebElements, item As WebElement, tempArr() As String, arr() As Variant, r As Long
ReDim arr(1 To 3, 1 To 2)
items = obj.FindElementByCss('.client-components-pie-style__legend span + span')
For Each item in items
r = r + 1
tempArr = split(item.text, ' ')
arr(r, 1) = tempArr(0)
arr(r, 2) = tempArr(1)
Next
Activesheet.Cells(1,1).Resize(UBound(arr,1), UBound(arr,2)) = arr
你可怕的长 xpath 在第一个 div[2] 上绊倒了。我建议,如果您想坚持使用 xpath,请使用相对的、更健壮的路径。在匹配方面相当于我的 css 将是:
Dim items As WebElements
Set items = obj.FindElementsByXpath('.//*[@class="client-components-pie-style__legendColor"]/following-sibling::span')
推荐阅读
- kotlin - Kotlin 错误智能转换为“X”是不可能的,因为“状态”是一个在尝试观察状态时具有打开或自定义 getter 的属性
- mongodb - 如何使用springboot应用程序在mongodb的不同数据库中创建集合
- python - 根据另一列删除熊猫数据框中的整行
- ios - 如何在 swiftUI 中将 Top Tabbar 与 ScrollView 或 List 同步?
- c++ - 是否可以在类定义中添加包含指令?
- django - 如何在 docker-compose 上运行 prometheus 并抓取本地运行的 django 服务器?
- python - jupyter and notbook installation issue in python 3.10
- java - Decrypting PDF using .enc file
- sql - 如何在 postgres 中显示每个类别的最大日期和条件
- firebase - 从cloudfunctions在firestore中设置数据时是否需要使用await