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

时间:2014-06-25 20:15:23

标签: 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的新手,所以任何帮助都会完全受到赞赏!

1 个答案:

答案 0 :(得分:0)

可以获得包含两个其他兄弟之间的兄弟元素的节点集,计算两个集合的交集设置A :第一个元素的跟随兄弟的元素集, Set 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'])])