当我在Selenium中使用以下XPath表达式时,它可以正常工作。它找到当前元素的祖先div,该元素的class属性中包含某个字符串:
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一起使用
最佳答案
要实现您想要的,甚至不需要concat('',@class,'')。
您应该可以使用
By.xpath("ancestor::div[contains(@class, ' x-form-item ')]")
因为您要在'@class'标签中寻找'x-form-item',而不是在'@class'标签中寻找。
关于css - 为什么在使用concat()时此Selenium XPath表达式无法返回结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15298013/