【问题标题】:Finding a specific table with no id查找没有 id 的特定表
【发布时间】:2016-12-30 02:04:45
【问题描述】:

我正在做我的第一个 selenium 项目,但遇到了一些障碍。我有一个包含 3 个不同表格的网页。我只想从这些表之一中提取数据。我面临的问题是引导程序用于设置这些页面的样式,因此所有表都共享同一个类,并且它们都没有我可以专门搜索的 id。通过搜索 tr/td 的 xpath,我能够在不同的页面上执行此操作,但由于有多个表,这不适用于此页面。检查我想从中提取数据的表的页面源,我得到如下内容:

<div class="col-md-4">
  <div class="panel panel-success">
    <div class="panel-panel-heading>
      <h3 class="panel-title">table title</h3>
    </div>
  <div class="table-responsive">
    <table class="table-striped table-bordered">
      <thead>...</thead>
      <tbody>
        <tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
          <td class="ng-binding">info1</td>
          <td class="ng-binding">info2</td>
          <td class="ng-binding">info3</td>
          <td class="ng-binding">info4</td>
        </tr>
        <tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
        <tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
        <tr ng-repeat="element in main.elementService.elementTable" class="ng-scope">
      </tbody>
    </table>
  </div>

所以这导致我不确定我可以使用什么来仅选择此表。如果我搜索trtd,我也会从页面上的其他表格中获取数据。

我看到的这张表的唯一独特之处是&lt;div class="col-md-4"&gt;. 我不知道这是否可能,但我的想法是进行某种组合搜索以转到此特定 div,然后转到 xpath tr/td 从表的每个单元格中提取数据,但我我是硒新手,我不知道该怎么做。我正在查看的文档似乎没有显示如何将多个策略组合在一起,而且我在为谷歌搜索措辞时遇到了麻烦,所以我还没有找到一个谷歌链接让我对如何做到这一点有任何见解.

我尝试过类似的方法,但我认为我的语法不正确

 List<WebElement> TableElems = chrome.findElements(By.xpath("//div[@class='col-md-4']//tr/td"));

我也试过

List<WebElement> TableElems = chrome.findElements(By.xpath("//div[@class='col-md-4']" && "//tr/td"));

但这里不允许使用 &amp;&amp; 运算符。

如果有人有任何想法可以提示我正确的方向,我将不胜感激。

【问题讨论】:

  • 仅供参考"col-md-4"divclass 属性而不是id...您应该尝试使用此xPath...List&lt;WebElement&gt; TableElems = chrome.findElements(By.xpath("//div[@class='col-md-4']/descendant::td"));
  • 我已经编辑了,谢谢。

标签: java html selenium xpath html-table


【解决方案1】:

你可以使用这个 xpath 表达式:

"//div[@class='col-md-4']//tr/td"

您尝试的不同之处在于使用class 属性(没有id)和tr 之前的双斜杠,这允许tr 成为div[@id='col-md-4'] 在任何深度和不只是直子。

【讨论】:

  • 我已经进行了这些编辑。我认为这不是正确的方法 - 它仍然没有做任何事情。
  • @JMullen 鉴于您的数据,这很难重现。但无论如何,您应该真正投资于学习 XPath 表达式或 CSS 选择器(请参阅@Carele 的答案)。否则,您只是迷失在盲目尝试寻求解决方案中。
  • 嗨 - 我收回了。我在编辑中犯了一个错误。这是正确的 - 谢谢。
【解决方案2】:

尝试改用“find_element_by_css_selector”方法。如果您遇到没有特定类的类似问题,也可以使用 CSS 选择器“nth-child”。 带类:

By.css(".col-md-4 tr > td")

如果所有表都有col-md-4类,如果你想要一个页面的第三个表:

By.css(".col-md-4:nth-child(3) tr > td")

此外,您为 xpath 请求提供了 id 属性,但“col-md-4”是 class,请小心。

【讨论】:

  • &gt; 字符在这里做什么?我是 selenium 的新手,我正在学习语法。我还没有看到这个。
  • 这是一个 CSS 选择器,表示第二个类是第一个类的直接子类(如果不使用它,则从 td 中选择任何 td 后代,即使该 tr 在另一个 div 或类似的东西)。如果您想在 tr 下获得任何 td,请抑制它。否则,您可以省略它,但只要我可以添加它们,我就可以。这是额外的安全措施。
【解决方案3】:

试试这样的:

//table[contains(concat(" ", normalize-space(@id), " "), " table-striped table-bordered"][//td[contains(text() , "info1")]])[1]

【讨论】:

  • 你能解释一下吗?
  • 按表包含搜索名称为 "table-striped talbe-bordered" 的表类,因此您不会搜索整个文档。然后在 td 中搜索包含文本“info1”的 td,然后通过 [1] 选择它的第一个元素
【解决方案4】:

您可以使用下面的 xpath 来按位置获取每个表的值。

.//table[1]/descendant::tr/td -for table 1
.//table[2]/descendant::tr/td -for table 2

【讨论】:

    【解决方案5】:

    你可以试试这个 Xpath

     /html/body/div/div/div/table/tbody/tr[1]/td[text()='info3']/../../.. 
    

    如果您尝试选择表格,以防您想选择 td 删除 td[text()='info3']

    之后的其余部分

    【讨论】:

      【解决方案6】:

      在这些情况下,我通常会先找到表格元素:

      List<WebElement> tables = (List<WebElement>)chrome.findElements(By.className("table-responsive"));
      

      然后得到你想要的确切表格:

      WebElement table = tables.get(i);
      

      您可以重复此操作并使用循环来获取所需的确切数据。

      List<WebElement> dataElements = (List<WebElement>)chrome.findElements(By.className("ng-binding"));
      for (int i=0; i<dataElements.size(); i++) {
          String data = dataElements.get(i).getText();
          //Do something with data
      }
      

      【讨论】:

        猜你喜欢
        • 2014-09-08
        • 1970-01-01
        • 2016-04-08
        • 2014-01-05
        • 2016-10-02
        • 1970-01-01
        • 2021-03-08
        • 2014-02-26
        • 2018-02-02
        相关资源
        最近更新 更多