Гарантируется ли одинаковый идентификатор, сгенерированный JSF, в разных версиях и реализациях? - PullRequest
4 голосов
/ 19 октября 2011

Мы собираемся написать полный набор тестов для одного из наших JSF-приложений с использованием Selenium.

Пока что кажется, что есть два предпочтительных подхода к уникальной идентификации каждого элемента: по идентификатору или с использованием уникального имени класса. Последнее действительно взломать и не имеет смысла семантически. Первый подход правильный, но идентификаторы элементов генерируются JSF.

Кажется, что все различные реализации JSF используют один и тот же подход: используйте родительский элемент в качестве пространства имен, а затем объедините идентификатор элемента с помощью двоеточия. Достаточно справедливо.

Вопрос: знаете ли вы, гарантируется ли это в какой-то части спецификации JSF? Позже будет реальной проблемой выяснить, что нам нужно переписать все селекторы компонентов в тестах только потому, что JSF x.y изменил способ генерации имен идентификаторов.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 19 октября 2011

JSF обычно генерирует ID компонентов, если атрибут ID не указан явно. Будет сгенерирован в формате j_idXXX (XXX will be number incremented)

<h:form id="LoginForm">
    <h:inputText id="userName" .../>
</h:form>

для этого inputText идентификатор будет сформирован как LoginForm:userName, и если идентификатор не указан явно, то будет сформировано что-то вроде LoginForm:j_id15

Это упоминается в спецификации JSF в разделе 3.1.6, но точный формат не указан. ClientId генерируется с использованием этого метода UIComponent.getClientId(); Перейдите по этой ссылке UIComponent

2 голосов
/ 19 октября 2011

Гарантируется ли одинаковый идентификатор, сгенерированный JSF, для разных версий и реализаций?

Нет.Вы должны явно указать идентификатор компонента для интересующего компонента UIInput и всех его родительских компонентов UINamingContainer, таких как <h:form>, <ui:repeat>, <h:dataTable> и т. Д.Эти идентификаторы по умолчанию будут добавлены с использованием символа-разделителя :.

Однако этот символ-разделитель, в свою очередь, настраивается начиная с JSF 2.0.Таким образом, если вы измените символ разделителя для своего веб-приложения с : на - или что-то еще, вам придется переписать тесты селена, основанные на идентификаторах HTML-элементов.

1 голос
/ 19 октября 2011

Из спецификации JSF (2.1) :

Идентификатор клиента получен из идентификатора компонента (или результата вызова UIViewRoot.createUniqueId() (если его нет) и идентификатор клиента ближайшего родительского компонента, который является NamingContainer в соответствии с алгоритмом, указанным в javadoc для UIComponent.getClientId().Затем рендереру, связанному с этим компонентом, будет предложено преобразовать этот идентификатор клиента в форму, подходящую для отправки клиенту.Значение, возвращаемое этим методом, должно быть одинаковым в течение всего времени существования экземпляра компонента, если только не вызывается setId(), и в этом случае оно будет пересчитано при следующем вызове getClientId().

Помимо спецификации, сторонние плагины могут влиять на идентификатор клиента (например, API-интерфейсы Protlet Bridge)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...