匹配元素id';具有JSF动态视图Id的

匹配元素id';具有JSF动态视图Id的,jsf,xpath,selenium,Jsf,Xpath,Selenium,我正在使用JSF1.2。我们想编写一些selenium测试(基于xpath),但xpath似乎没有元素id上的通配符匹配 我们不能关闭前缀ID,因为我们在IBMPortalServer6.1中作为portlet运行,并且我们的应用程序在前缀关闭的环境中中断 目前我们正在使用表单的XPath /*[子字符串(@id,54)='id\u distributorName'] 哪一个匹配: 但让我吃惊的是,假设JSF总是生成相同长度的viewId是危险的 有更好的方法吗 我们已经尝试在输入控件中使用n

我正在使用JSF1.2。我们想编写一些selenium测试(基于xpath),但xpath似乎没有元素id上的通配符匹配

我们不能关闭前缀ID,因为我们在IBMPortalServer6.1中作为portlet运行,并且我们的应用程序在前缀关闭的环境中中断

目前我们正在使用表单的XPath

/*[子字符串(@id,54)='id\u distributorName']

哪一个匹配:

但让我吃惊的是,假设JSF总是生成相同长度的viewId是危险的

有更好的方法吗


我们已经尝试在输入控件中使用
name
属性,但是JSF当然会忽略该属性,并编写自己的name属性,该属性的值与id匹配(可能是因为evant处理脚本的原因)

好的,我刚刚回答了我自己的问题

我承认我对XPath知之甚少,这是我的借口

答案是使用
contains()

i、 e。
/*[包含(@id,'id\u distributorName')]
如果您使用的是XPath 2.0,只需使用
ends-with()
函数:

/*[以(@id':id_distributorName')结尾]
如果您使用的是XPath 1.0,请使用
string-length()

/*[子字符串(@id,字符串长度(@id)-18)=':id\u distributorName']
这里,18是
id\u distributorName
(不带
前缀!)的长度。

使用

//*[substring-after(@id, ':commonEntryForm:') = 'id_distributorName']

这也将匹配像
foo:id\u distributorName:bar
myid\u distributorNames
这样的id,但并不十分健壮。