By.id,By.class Name和By.xpath的比较只给出了一个高级父ID和一个子类的className

时间:2014-08-07 03:00:50

标签: selenium xpath selenium-webdriver webdriver

免责声明:我完成了答案here。但是希望更多地了解类似于以下代码的情况。

<div id="feedback-filter-buttons" class="ui-buttonset">
    <label class="filter-label ui-button ui-corner-top" for="feedback-all" role="button">
      <span class="ui-button-text">Very Good</span>
    </label>
    <label class="ui-button" role="button">
      <span class="ui-button-text"><span > Good </span></span>
    </label>
    <label class="ui-button" role="button">
      <span class="ui-button-text"><span > Alright </span></span>
    </label>
    <label class="ui-button ui-state-active" role="button">
      <span class="ui-button-text"><span > Bad</span></span>
    </label>
    <label class="ui-button" role="button">
      <span class="ui-button-text"><span > Very Bad</span></span>
    </label>
    <label class="ui-button ui-corner-bottom" role="button">
      <span class="ui-button-text"><span > Undefined (0)</span></span>
    </label>
</div>

目标:
获取当前所选(即活动)标签(按钮)的文本。

方法:
a)webDriver.findElement(By.id("feedback-filter-buttons")).findElement(By.className("ui-state-active")).getText()

b)webDriver.findElement(By.xpath("//*[@id='feedback-filter-buttons']/label[contains(@class,'ui-state-active')]/span")).getText()

问题:
以上哪种方法更好,为什么?目前,我倾向于xpath,因为我能够指定路径,直到我需要的最终元素。

1 个答案:

答案 0 :(得分:3)

从性能的角度来看,xpath方法会更慢,我会选择第一个选项。

对于初学者,使用*(不指定实际标记),使其遍历树,进行整页扫描;然后你应用contains(),这是一个字符串匹配函数。

搜索By.id()绝对是最快的方法,因为它会调用getElementById()哪些浏览器知道如何优化。此外,您正在迅速将搜索范围缩小到父元素,然后按类名进行搜索。

此外,依赖这些idclass属性不仅可以使您的测试代码易读且易于理解,而且更加明确和健壮。考虑可能的错误:在xpath方法的情况下,你只会得到它无法使用你给它的xpath找到元素 - 没有真正提供信息,你甚至不知道从哪里开始调试。如果采用id+class方法,您会看到两种不同的错误:&#34;无法通过ID找到父级&#34;和&#34;无法按类名&#34;找到元素。