java - 如何获取另一个类的元素之间的元素计数?

标签 java html xpath selenium-webdriver

我需要获取第一个类别标题和第二个类别标题之间的行数,以在 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的新手,所以任何帮助将不胜感激!

最佳答案

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

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

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'])])

关于java - 如何获取另一个类的元素之间的元素计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24417747/

相关文章:

java - 有没有办法在用户输入特定单词之前禁用 JButton?

java - 如何根据SeekBar的进度设置WaveView的波高?

java - 多个浏览器同时与 Google Guice + TestNG + Selenium GRID + Maven 并行运行测试

javascript - 如何计算列表中的总计

php - HTML 动态选择,除了 if 语句

javascript - 如何保持导航标签不变

xpath - Marklogic:Xpath使用移除处理指令标签

java - Tomcat 一直要求输入密码和用户名

html - XPath - 在两个 DIV 之间选择文本(),该 DIV 由其中匹配的文本标识

c# - 使用 XPATH 在带有命名空间的 XML 中选择节点的问题