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 に答える