【问题标题】:How can I get the count of elements between elements of another class?如何获取另一个类的元素之间的元素计数?
【发布时间】:2014-06-28 01:04:51
【问题描述】:

我需要获取第一个类别标题和第二个类别标题之间的行数,以在 for 循环中用作增量。这是一个html示例:

<div class="datagrid-ready" range="0:49" chunk-id="0.0" style="width:100%;height:2220px;" enabled="true">    
    <div class="categoryHeader" template="group" row-id="0">...</div>
    <div class="productTableRow" template="row" row-id="1">...</div>
    <div class="productTableRow" template="row" row-id="2">...</div>
    <div class="productTableRow" template="row" row-id="3">...</div>
    <div class="productTableRow" template="row" row-id="4">...</div>
    <div class="productTableRow" template="row" row-id="5">...</div>
    <div class="categoryHeader" template="group" row-id="6">...</div>
    <div class="productTableRow" template="row" row-id="7">...</div>
    <div class="categoryHeader"  template="group" row-id="8">...</div>
    <div class="productTableRow" template="row" row-id="9">...</div>
    <div class="productTableRow" template="row" row-id="10">...</div>
    <div class="productTableRow" template="row" row-id="11">...</div>
    <div class="categoryHeader" template="group" row-id="12">...</div>
    <div class="productTableRow" template="row" row-id="13">...</div>
    <div class="productTableRow" template="row" row-id="14">...</div>
</div>

这是我到目前为止整理的内容(显然它不起作用):

final int noItemsIn1stCat = driver.findElement(By.xpath("//div[@class='datagrid-ready']/div[contains(@class,'productTableRow')]")).size();

我不知道如何将5 变成noItemsIn1stCat

使用 css 选择器会更容易或更可靠吗?

我是 java 和 selenium 的新手,所以任何帮助都将不胜感激!

【问题讨论】:

  • 您的 div 没有结束标签。它们实际上是兄弟姐妹还是嵌套的?
  • 你可以获得那些计算交点的元素。请参阅:stackoverflow.com/questions/24247331/…stackoverflow.com/questions/24193807/…
  • 如果可能的话,我建议您与开发人员交谈并要求他们以更智能和更可测试的方式重组 div,即将 .productTableRow 嵌套在 .categoryHeader 中。例如:
  • 对不起,我从 Firebug 复制了 div 折叠以简化问题。 datagrid-ready div 是以下所有 div 的父 div。 (它们确实有折叠时不可见的结束标签。)

标签: java html xpath selenium-webdriver


【解决方案1】:

可以通过计算两个集合的交集来获得包含其他两个兄弟元素之间的兄弟元素的节点集。 Set A在第一个元素的兄弟元素之后的元素集合,其中 Set B元素的集合最后一个元素的前兄弟

您可以使用Kaysian method 选择两个集合之间的交集(请参阅我在 cmets 中发布的链接中的更详细说明)。求交点的公式为:

SetA [ count( . | setB) = count( setB ) ]

将其应用于您的问题,并:

SetA = //div[@class='datagrid-ready']
        /div[@class='categoryHeader'][1]
        /following-sibling::div[@class='productTableRow']

SetB = //div[@class='datagrid-ready']
        /div[@class='categoryHeader'][2]
        /preceding-sibling::div[@class='productTableRow']

你有:

//div[@class='datagrid-ready']
  /div[@class='categoryHeader'][1]
  /following-sibling::div[@class='productTableRow']
    [ count( . | //div[@class='datagrid-ready']
                  /div[@class='categoryHeader'][2]
                  /preceding-sibling::div[@class='productTableRow'])
    = count( //div[@class='datagrid-ready']
              /div[@class='categoryHeader'][2]
              /preceding-sibling::div[@class='productTableRow'] ) ]

或一行:

//div[@class='datagrid-ready']/div[@class='categoryHeader'][1]/following-sibling::div[@class='productTableRow'][count(.|//div[@class='datagrid-ready']/div[@class='categoryHeader'][2]/preceding-sibling::div[@class='productTableRow']) = count( //div[@class='datagrid-ready']/div[@class='categoryHeader'][2]/preceding-sibling::div[@class='productTableRow'] ) ]

在您的示例中,此表达式将选择这五个节点:

<div class="productTableRow" template="row" row-id="1">
<div class="productTableRow" template="row" row-id="2">
<div class="productTableRow" template="row" row-id="3">
<div class="productTableRow" template="row" row-id="4">
<div class="productTableRow" template="row" row-id="5">

计算个节点,只需将整个表达式作为参数传递给count() 函数:

count(//div[@class='datagrid-ready']/div[@class='categoryHeader'][1]/following-sibling::div[@class='productTableRow'][count(.|//div[@class='datagrid-ready']/div[@class='categoryHeader'][2]/preceding-sibling::div[@class='productTableRow']) = count( //div[@class='datagrid-ready']/div[@class='categoryHeader'][2]/preceding-sibling::div[@class='productTableRow'])])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多