问题描述
|
我有以下Xpath表达式:
//*[not(input)][ends-with(@*,\'copyright\')]
我希望它可以为我提供除输入以外的所有元素,并带有以\“ copyright \”结尾的任何属性值。
我使用webDriver.findElements(By.xpath(expression))
在Selenium 2 Java API中执行它,并得到以下错误:
此表达不合法
表达
但是这些表达式可以正常工作:
//*[not(input)][starts-with(@*,\'copyright\')]
//*[ends-with(@*,\'copyright\')]
有任何想法吗?
解决方法
我有以下Xpath表达式:
//*[not(input)][ends-with(@*,\'Copyright\')]
我希望它能给我所有要素-
输入除外-具有任何属性
以\“ Copyright \”结尾的值。
这里有一些问题:
ends-with()
仅是标准的XPath 2.0函数,因此您可能正在使用XPath 1.0引擎,并且由于它不知道称为ѭ4function的函数,因此它会正确引发错误。
即使您使用的是XPath 2.0处理器,在一般情况下,表达式ѭ6error也会导致错误,因为to4ѭ函数被定义为最多接受单个字符串(xs:string?
)作为其两个操作数-但是@*
会产生一个序列如果元素具有多个属性,则为多个字符串。
//*[not(input)]
并不意味着\“选择所有未命名为input
的元素。真正的含义是:\”选择所有不具有名为\“ input \”的子元素的元素。
解:
使用此XPath 2.0表达式://*[not(self::input)][@*[ends-with(.,\'Copyright\')]]
对于XPath 1.0,请使用以下表达式:
....
//*[not(self::input)]
[@*[substring(.,string-length() -8) = \'Copyright\']]
这是使用XSLT对最后一个XPath表达式进行的简短完整的验证:
<xsl:stylesheet version=\"1.0\"
xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">
<xsl:output omit-xml-declaration=\"yes\" indent=\"yes\"/>
<xsl:strip-space elements=\"*\"/>
<xsl:template match=\"/*\">
<xsl:copy-of select=
\"//*[not(self::input)]
[@*[substring(.,string-length() -8)
= \'Copyright\'
]
]\"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下XML文档时:
<html>
<input/>
<a x=\"Copyright not\"/>
<a y=\"This is a Copyright\"/>
</html>
所需的正确结果产生了:
<a y=\"This is a Copyright\"/>
如果XML文档位于默认名称空间中:
<xsl:stylesheet version=\"1.0\"
xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"
xmlns:x=\"http://www.w3.org/1999/xhtml\"
>
<xsl:output omit-xml-declaration=\"yes\" indent=\"yes\"/>
<xsl:strip-space elements=\"*\"/>
<xsl:template match=\"/*\">
<xsl:copy-of select=
\"//*[not(self::x:input)]
[@*[substring(.,string-length() -8)
= \'Copyright\'
]
]\"/>
</xsl:template>
</xsl:stylesheet>
应用于此XML文档时:
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<input z=\"This is a Copyright\"/>
<a x=\"Copyright not\"/>
<a y=\"This is a Copyright\"/>
</html>
所需的正确结果产生了:
<a xmlns=\"http://www.w3.org/1999/xhtml\" y=\"This is a Copyright\"/>
, 我不知道Selenium,但是如果成功解析了//*[not(input)][starts-with(@*,\'Copyright\')]
,并且如果另外支持XPath 2.0函数ends-with
,那么我看不出任何不接受//*[not(input)][ends-with(@*,\'Copyright\')]
作为合法表达式的原因。但是,您的口头描述听起来像是要want23ѭ。
“ 10”选择不具有任何输入子元素的任何元素,而“ 25”选择不自身作为“ 11”元素的任何元素。至于将ѭ27与您所拥有的进行比较,我的建议是正确的,只要有一个以''Copyright \'结尾的属性节点,而您的测试仅在有一个以''Copyright \'结尾的属性时起作用,作为结尾(以http://www.w3.org/TR/xquery-operators/#func-ends-with结尾)允许以单个项目作为其第一个参数的序列或一个空序列但不允许多个项目。
, 最可能的解释是您正在使用XPath 1.0处理器。 ends-with()函数需要XPath 2.0支持。
, //*[not(self::input)][@*[substring(.,string-length(.) -8) = \'Copyright\']]
可能是29ѭ的小修正
现在,它可能会起作用。