Selenium 和 JSF 2.0

发布于 2024-12-02 08:06:07 字数 323 浏览 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

墨落成白 2024-12-09 08:06:07

通常,表单的 id 会添加到表单内所有元素 id 的前面。如果您没有设置表单 ID,JSF 会为您完成此操作(“j_idt9”)。解决方案:为您的表单分配一个 id 并尝试在 findElement 方法中使用完整的 id,例如:

<h:form id="myForm">
 ...
</h:form>

这样调用:

driver.findElement(By.id("myForm:my_fancy_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 findElementmethod, e.g.:

<h:form id="myForm">
 ...
</h:form>

Call it this way:

driver.findElement(By.id("myForm:my_fancy_id"));
墟烟 2024-12-09 08:06:07

或者您可以添加这样表单的 id 就不会被添加到前面

or you can add <h:form prependId="false"> so that the id of the form does not get prepended

隐诗 2024-12-09 08:06:07

您设置 组件标识符 在控件上;渲染器发出 客户端标记的标识符

这使得 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文