硒2.0中css和等效xpath之间的差异

时间:2013-09-27 11:40:28

标签: css scala xpath selenium selenium-webdriver

selenium和css / xpath定位器还是新手。我偶然发现了CSS工作的问题,但相同的XPath没有,我真的很想知道原因。我在示例中使用Scala,但它仍然是普通的Java Selenium2库。我也使用FirefoxDriver

以下是HTML的有趣部分:

...
<li class="k-item k-filter-item k-state-default k-last" role="menuitem" style="z-index: auto;">
  ...
  <form class="k-filter-menu k-secondary">
    <div>
      <div class="k-filter-help-text">Show items with value that:</div>
      <span class="k-widget k-dropdown k-header" style="" unselectable="on" role="listbox" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-owns="" aria-disabled="false" aria-readonly="false" aria-busy="false">
      <span class="k-widget k-datetimepicker k-header" style="">
      <div>
        <button class="k-button" type="submit">Filter</button>
        <button class="k-button" type="reset">Clear</button>
      </div>
    </div>
  </form>
</li>
...

我正在使用

获取 li
val filter = driver.findElement(By.cssSelector("li.k-filter-item"))

对我有用。

然后,我想找到按钮。这是一个动态菜单,它滑出来,什么不是,所以我需要等待它出现:

new WebDriverWait(driver, selectorTimeout).until(
  new ExpectedCondition[Boolean] {
    override def apply(d: WebDriver) = {
      filter.findElement(By.cssSelector("button[type=submit]")).isDisplayed
    }
  })

这也很好用。我的问题是,为什么xpath等效不起作用:

new WebDriverWait(driver, selectorTimeout).until(
  new ExpectedCondition[Boolean] {
    override def apply(d: WebDriver) = {
      filter.findElement(By.xpath("//button[@type='submit']")).isDisplayed
    }
  })

任何人

[编辑]
Selenium版本:2.35.0
FireFox驱动程序:2.35.0

我现在会尝试使用Opera。

1 个答案:

答案 0 :(得分:1)

无论如何,你需要在XPath选择器前面.,这样才能搜索当前元素的后代/子代:

.//button[@type='submit']

有时,更精细的XPath也可以提供帮助:

.//descendant::button[@type='submit']