在 selenium 中通过...(."<table class = "table table-bordered table-condensed table-striped

Posted

技术标签:

【中文标题】在 selenium 中通过...(."<table class = "table table-bordered table-condensed table-striped text-center table-hover">") 查找元素【英文标题】:Find element by...(."<table class = "table table-bordered table-condensed table-striped text-center table-hover">") in selenium 【发布时间】:2022-01-21 14:39:41 【问题描述】:

我正在使用 Selenium.Driver 查找应该返回网页中特定表格的 div 类元素。 虽然通过 find by tag 方法成功地抽象了整个页面,但我现在面临的挑战是,只返回页面中的表格,除了表格类被列为“复合名称”并且在 Selenium 中不受支持: 我尝试了 .xpath 和 .css 方法都没有成功。我的失败可能是因为使用了错误的表达方式。

我的代码:

Set htmlTables = HTMLDoc.FindElementsByTag("table")

' The above code returns all elements within the entire page.

' Instead of finding elements by "table" tag,
' I wanna FindElement(s)By...("table table-bordered table-condensed table-striped 
  text-center table-hover")
' The given code shall return ONLY the TABLE from within the entire page.

这是我的问题的update,我添加了micro 和目标html pageurl 链接也已发布。

代码: enter image description here

网址链接:https://portalseven.com/lottery/southafrica_powerball_winning_numbers.jsp?viewType=2&timeRange=3

【问题讨论】:

使用元素的相关 HTML 更新问题。 感谢@DbjB 的回复,让我完成您的示例。 您希望定位的网站和特定表是什么?您展示的 html 复合类很常见 Bootstrap 并且经常在一个页面上多次使用。 我开始怀疑这个问题是基于库的。 excel 2010 是否有可能根本不支持使用复合名称? 响应 QHarr:这个复合名称只列出一次,并且是唯一包含目标表的元素。让我上传更多信息。 【参考方案1】:

如果你正在寻找所有的复合类选择这个

Dim Table As Selenium.WebElement
Set Table = driver.FindElementByXPath("//*[@class='table table-bordered table-condensed table- striped text-center table-hover']")

如果你正在寻找复合类的一部分,你也可以使用

Dim FindBy As New Selenium.By
If Not driver.IsElementPresent(FindBy.Class("table-condensed"), 3000) Then
    driver.Quit
    Exit Sub
Else
    ' do something ...
    Set Table = driver.FindElement(FindBy.Class("table-condensed"))
End If

或者

Dim FindBy As New Selenium.By
If Not driver.IsElementPresent(FindBy.Css(".table-bordered"), 3000) Then
    driver.Quit
    Exit Sub
Else
    ' do something ...
    Set Table = driver.FindElement(FindBy.Css(".table-bordered"))
End If

您的代码的问题在于Set Table = ...。将下面的 Set Table 行与您的进行比较。 我在 Excel 2007 中测试了这个过程,它可以工作!

Sub Selenium_FindElementByClass_Compound()
    Dim driver As New WebDriver
    Dim myUrl As String
    Dim Table As Selenium.WebElement
       
    ' Set URL
    myUrl = "https://portalseven.com/lottery/southafrica_powerball_winning_numbers.jsp?viewType=2&timeRange=3"
    
    ' Open chrome
    driver.Start "Chrome"
    
    ' Navigate to Url
    driver.Get myUrl
    Application.Wait Now + TimeValue("00:00:5")
    
    ' Find table
    Set Table = driver.FindElementByXPath("//*[@class='table table-bordered table-condensed table-striped text-center table-hover']")
    
    ' Copy table to Excel
    Table.AsTable.ToExcel ThisWorkbook.Worksheets.Add.Range("A1")
End Sub

【讨论】:

Elio,所有示例都返回错误“32”消息。我已经怀疑库问题,即我使用的是 excel 2010,而不是当前版本。 .driver 引用似乎根本不受支持。我会上传网站和具体页面。 我已经尝试了我发布的代码并且所有示例都有效!你能分享你正在使用的网址吗?也分享整个错误消息。 这是真的,Elio,因此我认为:代码可以在 excel 2016 平台上运行,而不是在 2010 版本上运行。如果可以,您是否有机会在 2016 平台上运行此测试?让我按要求上传。 我有 Excel 2013、2016 和 Office 365。 能否在 2010 平台上测试代码,看看输出是否为正。我已经根据要求更新了问题。谢谢。

以上是关于在 selenium 中通过...(."<table class = "table table-bordered table-condensed table-striped 的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中通过 C# (Selenium) 自动登录 Gmail

在 selenium python 中通过 href 查找链接

Python Selenium 无法使用 Selenium 和 Python 在#shadow-root (open) 中通过 xpath 找到元素

如何使用python在selenium中通过其id名称的一部分查找元素

python中通过selenium简单操作及元素定位

Selenium中通过修改User-Agent标识将PhantomJS伪装成Chrome浏览器