代码之家  ›  专栏  ›  技术社区  ›  Filip Dupanović

Selenium可以评估所有xpath元素吗?

  •  10
  • Filip Dupanović  · 技术社区  · 15 年前

    硒是否可以评估所有可能与某一特定元素匹配的元素? XPath ?

    例如,我想评估一下 复选框 与…核对 //input[type='checkbox'] --问题是我只返回一个元素。

    5 回复  |  直到 12 年前
        1
  •  11
  •   Dave Hunt    15 年前

    可以使用getxpathcount命令确定匹配元素的数量。然后,您可以使用一个增量在它们之间循环,分别定位每个元素。下面的Java(TestNg/JUnit)示例将检查页面上的所有复选框是否被选中:

    int totalCheckboxes = session().getXpathCount("//input[@type='checkbox']").intValue();
    for (int i = 1; i < totalCheckboxes+1; i++) {
        assertTrue(session().isChecked("//input[@type='checkbox'][" + i + "]"));
    }
    
        2
  •  5
  •   samaitra    13 年前

    我尝试了上述方法,Selenium抛出了未找到元素的异常。添加前缀xpath=解决了问题。

    例子

    xpath=(//td[@class='cell name bold'])[1]
    xpath=(//td[@class='cell name bold'])[2] 
    
        3
  •  4
  •   Sierra    14 年前

    /descendant::input[@type='text'][1]
    /descendant::input[@type='text'][2]
    

    您只能搜索 全部的 在树中输入元素。如果您只想解析子树,它将不起作用。

    更好的方法是:

    (/form/div/input[@type='text'])[1]
    (/form/div/input[@type='text'])[2]
    

    它将返回括号内xpath表达式的结果1、2等。

    当然你也可以

    (//input[@type='text'])[1]
    

    这非常方便,因为Selenium只使用第一个匹配,无法处理结果集,而这正是XPath通常返回的结果集。

        4
  •  2
  •   Santi    15 年前

    Selenium无法评估定位器返回的项目列表。 它只是抓住第一个,然后就这么做了。

    戴夫的回答是你所寻找的最好的选择。

        5
  •  2
  •   user302384    15 年前

    我尝试在Selenium中做完全相同的事情,并尝试使用@Dave Hunt的示例,但这是在集合中查找单个元素的错误方法。

    请考虑以下示例:

    <form>
     <div>
      <input type="text" name="field1" />
     </div>
     <div>
      <input type="text" name="field2" />
     </div>
    </form>
    

    如果使用如下表达式:

    //input[@type='text'][1]
    

    这将返回页面中的所有文本输入。为什么?因为每个输入都是它自己树中的第一个匹配元素。

    但是,如果使用如下表达式:

    /descendant::input[@type='text'][1]
    

    /descendant::input[@type='text'][2]
    

    第一个表达式将获取第一个输入,第二个表达式将获取第二个输入。使用单个“/”而不是双“/”非常重要。