Css 为什么使用concat()时,此Selenium XPath表达式无法返回结果?

Css 为什么使用concat()时,此Selenium XPath表达式无法返回结果?,css,internet-explorer,xpath,selenium,concat,Css,Internet Explorer,Xpath,Selenium,Concat,在Selenium中使用以下XPath表达式时,它工作正常。Its查找当前元素的祖先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这样的

在Selenium中使用以下XPath表达式时,它工作正常。Its查找当前元素的祖先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'')

注意:我使用IE9的IEDriver来实现您想要的,您甚至不需要concat(“”,@class“”)。 你应该能够使用

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

因为您正在“@class”标记中查找“x-form-item”,而不是在“@class”标记中查找。

不幸的是,我事先不知道该类是“嵌入”在其他类名之间的。例如,class属性可以包含“x-form-item class1 class2”,也可以类似于“class1 class2 x-form-item”,甚至只是“x-form-item”。因此,如果没有concat,所有这些都不会匹配表达式。您能提供完整的xpath吗?