2

Selenium で次の XPath 式を使用すると、正しく動作します。class 属性に特定の文字列を含む現在の要素の祖先 div を見つけます。

inputEl.findElement(By.xpath("ancestor::div[contains(@class, 'x-form-item')]")).getAttribute("class")

それが与える答えは"x-form-item "(末尾のスペースに注意してください)です。

x-form-itemただし、のような他のクラスではなく、クラスを正確に持つ祖先が必要ですx-form-item-label。そこで、次のように表現を変更しました。

inputEl.findElement(By.xpath("ancestor::div[contains(concat(' ', @class, ' '), ' x-form-item ')]")).getAttribute("class")

ただし、これが配置されると、Selenium は要素を見つけることができなくなります。次のエラーが発生します。

org.openqa.selenium.NoSuchElementException: Unable to find element with xpath == ancestor::div[contains(concat(' ', @class, ' '), ' x-form-item ')] (WARNING: The server did not provide any stacktrace information)

最初は何かの間違いかと思ったので、簡単にするために先頭/末尾のスペースを削除しました。おそらく、これは私の最初の作業クエリと意味的に同じです。

inputEl.findElement(By.xpath("ancestor::div[contains(concat('', @class, ''), 'x-form-item')]")).getAttribute("class")

ただし、これも失敗します。

org.openqa.selenium.NoSuchElementException: Unable to find element with xpath == ancestor::div[contains(concat('', @class, ''), 'x-form-item')] (WARNING: The server did not provide any stacktrace information)

私の基本的な質問は、なぜこれら 2 つの結果が異なる文字列になるのかということです。

  • @class
  • concat('', @class, '')

注:IE9でIEDriverを使用しています

4

1 に答える 1

0

目的を達成するために、concat(' ', @class, ' ') さえ必要ありません。あなたは使用できるはずです

By.xpath("ancestor::div[contains(@class, ' x-form-item ')]")

「@class」タグではなく、「@class」タグで「 x-form-item 」を探しているためです。

于 2013-03-11T19:08:53.110 に答える