1

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 试试。

4

1 回答 1

1

无论如何,您都需要.在 XPath 选择器前面,以便它搜索当前元素的后代/子元素:

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

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

.//descendant::button[@type='submit']
于 2013-09-27T14:31:30.533 回答