Selenium 和 JSF 2.0
当我使用 JSF2.0 生成 SelectOneMenu 时,我在 xhtml 中指定的 id 会附加到从 JSF 生成的 ID。
例如,从 my_fancy_id
生成 j_idt9:my_fancy_id
现在我想使用 Selenium 2 Web Driver 测试我的页面。我尝试重新查找我的选择菜单:
driver.findElement(By.id("my_fancy_id"));
当然,它没有找到任何内容,因为 id 已更改。在页面上查找选择菜单的最佳方式是什么?
When I a generate SelectOneMenu with JSF2.0 the the id I specified in the xhtml is attached to a generated ID from JSF.
e.g. out of my_fancy_id
it generates j_idt9:my_fancy_id
Now I want to test my page with Selenium 2 Web Driver. I try to re-find my select menu:
driver.findElement(By.id("my_fancy_id"));
Of course it does't find anything because the id is changed. What is the best way to find the select menu on the page?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
通常,表单的 id 会添加到表单内所有元素 id 的前面。如果您没有设置表单 ID,JSF 会为您完成此操作(“j_idt9”)。解决方案:为您的表单分配一个 id 并尝试在
findElement
方法中使用完整的 id,例如:这样调用:
Usually the id of the form is prepended to all element ids inside the form. If you don't set a form id, JSF does it for you (the 'j_idt9'). Solution: Assign an id to your form and try to use the full id in your
findElement
method, e.g.:Call it this way:
或者您可以添加这样表单的 id 就不会被添加到前面
or you can add <h:form prependId="false"> so that the id of the form does not get prepended
您设置 组件标识符 在控件上;渲染器发出 客户端标记的标识符。
这使得 JSF 能够发出有效的 HTML id(它们必须是唯一的),即使面对模板和复杂的控件也是如此。控件将由任何 的父级命名空间NamingContainer(例如 表单< /a>)。
在某些容器中,客户端标识符将由视图命名,但这通常只发生在 portlet 环境中。
一些组件库(例如 Tomahawk)具有
forceId
属性,但使用时必须小心。我在此处写了一篇关于客户端标识符的更广泛的文章。You set the component identifier on controls; the renderers emit the client identifier to the markup.
This allows JSF to emit valid HTML ids (they must be unique) even in the face of templates and complex controls. A control will be namespaced by any parent that is a NamingContainer (such as a form).
In some containers, the client identifier will be namespaced by the view, but this generally only happens in portlet environments.
Some component libraries (like Tomahawk) have a
forceId
attribute, but care must be exercised in using them. I wrote a more extensive post on client identifiers here.