Java 如何获得另一个类的元素之间的元素计数?

Java 如何获得另一个类的元素之间的元素计数?,java,html,xpath,selenium-webdriver,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>

我需要获得第一个类别头和第二个类别头之间的行数,以便在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>
我不知道如何进入noItemsIn1stCat

使用css选择器是更容易还是更可靠


我对java和selenium还不熟悉,因此非常感谢您的帮助

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

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

SetA [ count( . | setB) = count( setB ) ]
将其应用于您的问题,包括:

SetA = //div[@class='datagrid-ready']
        /div[@class='categoryHeader'][1]
        /following-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">

你的div没有结束标记。它们实际上是同级还是嵌套的?可以通过计算交点获得这些元素。请看:如果可能的话,我建议您与开发人员交谈,并要求他们以更智能、更可测试的方式重组div,即嵌套.productTableRow in.categoryHeader。对不起,为了简化问题,我复制了Firebug的内容,并折叠了div。datagrid就绪div是以下所有div的父div。它们确实具有折叠时不可见的结束标记。
//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(//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'])])