我正在使用JSF 1.2。我们想编写一些selenium测试(基于xpath),但xpath似乎没有对元素id进行通配符匹配。
我们无法关闭前缀ID,因为我们在IBM Portal Server 6.1中作为portlet运行,并且我们的应用程序在前缀关闭的情况下在该环境中中断。
目前我们正在使用
形式的xpath //*[substring(@id, 54)='id_distributorName']
将匹配:
<select size="1" class="firstName" name="viewns_7_8000CB1A0GUIE0IJF799CR10O2_:commonEntryForm:id_distributorName" id="viewns_7_8000CB1A0GUIE0IJF799CR10O2_:commonEntryForm:id_distributorName" >
但是让我觉得假设JSF总是生成一个相同长度的viewId是危险的。
有更好的方法吗?
我们尝试对输入控件使用name
属性,但当然JSF会忽略该属性并编写自己的name属性,其值与id相匹配,大概是为了处理脚本的原因)
答案 0 :(得分:6)
如果您使用的是XPath 2.0,只需使用ends-with()
功能:
//*[ends-with(@id, ':id_distributorName')]
如果您使用的是XPath 1.0,请使用string-length()
来计算substring()
的开头:
//*[substring(@id, string-length(@id) - 18) = ':id_distributorName']
此处,18是id_distributorName
的长度(没有:
前缀!)。
答案 1 :(得分:5)
好的我刚刚回答了我自己的问题。
我承认我对xpaths知之甚少,这是我的借口!
答案是使用contains()
即。
//*[contains(@id, 'id_distributorName')]
答案 2 :(得分:0)
使用强>:
//*[substring-after(@id, ':commonEntryForm:') = 'id_distributorName']