当我在Selenium中使用以下XPath表达式时,它可以正常工作。它找到当前元素的祖先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)
所以我的基本问题是,为什么这两个导致不同的字符串?
@class
concat('', @class, '')
注意:我正在使用IEDriver和IE9
答案 0 :(得分:0)
为了实现你想要的,你甚至不需要concat('',@ class,'')。 你应该可以使用
By.xpath("ancestor::div[contains(@class, ' x-form-item ')]")
因为你在'@class'标签中寻找'x-form-item',而不是在'@class'标签中查找。