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を使用しています