我需要获取第一个类别标题和第二个类别标题之间的行数,以在 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/