我们即将使用Selenium为我们的一个JSF应用程序编写一整套测试。
到目前为止,似乎有两种首选方法可以唯一标识每个元素:通过ID或使用唯一的类名。后者实际上是一个黑客,在语义上没有意义。前者是正确的方法,但元素ID由JSF生成。
我见过的所有不同的JSF实现似乎都使用相同的方法:使用父元素作为命名空间,然后使用冒号连接元素ID。很公平。
问题是:你知道JSF规范的某些部分是否有保证吗?稍后发现我们需要在测试中重写所有组件选择器只是因为JSF x.y改变了它生成ID名称的方式,这是一个真正的问题。
谢谢!
答案 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)
客户端标识符源自component identifier (或者如果有的话,调用
UIViewRoot.createUniqueId()
的结果 不是一个),以及最近的父组件的客户端标识符 根据指定的算法,它是NamingContainer
在UIComponent.getClientId()
的javadoc中。渲染器 然后,将要求与此组件相关联的组件进行转换 此客户端标识符适用于发送到的表单 客户。从此方法返回的值必须相同 除非setId()
,否则在组件实例的整个生命周期中 调用,在这种情况下,它将通过下一次调用重新计算getClientId()
。
除规范外,第三方插件可能会影响客户端标识符(例如protlet网桥API)