JSF生成的ID是否保证在不同版本和实现中是相同的?

时间:2011-10-19 03:21:27

标签: jsf testing selenium

我们即将使用Selenium为我们的一个JSF应用程序编写一整套测试。

到目前为止,似乎有两种首选方法可以唯一标识每个元素:通过ID或使用唯一的类名。后者实际上是一个黑客,在语义上没有意义。前者是正确的方法,但元素ID由JSF生成。

我见过的所有不同的JSF实现似乎都使用相同的方法:使用父元素作为命名空间,然后使用冒号连接元素ID。很公平。

问题是:你知道JSF规范的某些部分是否有保证吗?稍后发现我们需要在测试中重写所有组件选择器只是因为JSF x.y改变了它生成ID名称的方式,这是一个真正的问题。

谢谢!

3 个答案:

答案 0 :(得分:4)

如果没有明确提到ID属性,JSF通常会生成组件的ID。 它将以j_idXXX (XXX will be number incremented)

格式生成
<h:form id="LoginForm">
    <h:inputText id="userName" .../>
</h:form>

对于此inputText,id将形成为LoginForm:userName,如果未明确提及id,则它将形成类似LoginForm:j_id15

的内容

JSF规范3.1.6节中提到了这一点,但是没有指定确切的格式。 clientId是使用此方法生成的UIComponent.getClientId();请点击此链接UIComponent

答案 1 :(得分:2)

  

JSF生成的ID是否保证在不同版本和实现中相同?

没有。您需要在感兴趣的UIInput组件及其所有父UINamingContainer组件上明确指定组件ID,例如<h:form><ui:repeat><h:dataTable>,等你自己。默认情况下,这些ID将使用分隔符:进行木材处理。

但是,自JSF 2.0以来,分隔符字符又可以配置。因此,如果您将webapp的分隔符字符从:更改为-或其他内容,那么您必须重写依赖于HTML元素ID的selenium测试。

答案 2 :(得分:1)

来自JSF (2.1) spec

  

客户端标识符源自component identifier   (或者如果有的话,调用UIViewRoot.createUniqueId()的结果   不是一个),以及最近的父组件的客户端标识符   根据指定的算法,它是NamingContainer   在UIComponent.getClientId()的javadoc中。渲染器   然后,将要求与此组件相关联的组件进行转换   此客户端标识符适用于发送到的表单   客户。从此方法返回的值必须相同   除非setId(),否则在组件实例的整个生命周期中   调用,在这种情况下,它将通过下一次调用重新计算   getClientId()

除规范外,第三方插件可能会影响客户端标识符(例如protlet网桥API)