Перейти к содержимому

Фотография

AddLocationStrategy for JSF ID's


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 24

#1 Helenka

Helenka

    Новый участник

  • Members
  • Pip
  • 27 сообщений
  • ФИО:Elena

Отправлено 31 марта 2011 - 09:33

Здравсвуйте,
я новичок в тестировании и в селениуме.
Тесты на seleniumRC+JUnit. Тестирую веб приложение, которое написано на основе JSF. Проблема в том, что часть ID генерируется автоматически, а часть остается статической. эту статическую часть ID я бы хотела использовать как локатор для элемента. Например, ID = "jsfwmp9169:defaultForm:import:defaultForm:vorname0", vorname0 - статичен и по нему можно было бы найти элемент.
Может кто-нибудь знает, как можно это реализовать, например с помощью AddLocationStrategy.
Или, возможно, вы уже сталкивались с проблемой и решили ее более оптимальным способом.

P.S. XPath не хотелось бы использовать, т.к. приложение еще в стадии разработки. Разработчики пообещали, что часть id будет оставаться постоянной.

Очень надеюсь на помощь!

Заранее спасибо. Елена
  • 0

#2 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 31 марта 2011 - 09:48

Да, можно написать свой тип селектора, типа "idp=vorname0", который будет искать по части ID. Оптимизированный код поиска элемента по части ID можно подсмотреть в jQuery, например.
  • 0

#3 SMakc

SMakc

    Новый участник

  • Members
  • Pip
  • 56 сообщений
  • ФИО:Максим
  • Город:Москва

Отправлено 31 марта 2011 - 09:55

а юзать те же CSS Selectors если уж по непонятным для меня причинам использование XPath противоречит Вашим религиозным соображениями:
css=button[id$='vorname0']

  • 0

#4 Helenka

Helenka

    Новый участник

  • Members
  • Pip
  • 27 сообщений
  • ФИО:Elena

Отправлено 31 марта 2011 - 11:23

Спасибо. Поищу что-нибудь подходящее в JQuery. Если у вас есть ссыслка наготове - буду благодарна.
По поводу CSS и XPath: необходимо ведь указывать ID полностью, чтобы референцировать элемент. Или я ошибаюсь? Полностью использовать ID невозможно, т.к. определенная их часть постоянно меняется.
  • 0

#5 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 31 марта 2011 - 11:45

xpath=//*[contains(@id, 'vorname0')], но этот способ немного кривоватый.

PS: "референцировать" - еле произнёс :biggrin:
  • 0

#6 Helenka

Helenka

    Новый участник

  • Members
  • Pip
  • 27 сообщений
  • ФИО:Elena

Отправлено 04 апреля 2011 - 06:53

Доброе утро,
у меня возникла еще одна проблемка с ID, может у кого-нибудь есть идея. Строки в таблице генерируются автоматически и только имя таблицы остается постоянным (asyncTable1).
(jsfwmp7795:defaultForm:import:defaultForm:asyncTable1:__rowAlexandridisBenWedu_0020_Sepu_0020_19u_0020_00u_003a_00u_003a_00u_0020_CESTu_0020_2007:selectRowOnClick) - это ID radiobutton.
Пока даже понятия не имeю, как мне работать с этими таблицами и как однозначно выбирать ее элементы.
Если была у вас такая же проблема и вы ее решили, подскажите, пожалуйста.

P.S. слово "референцировать" буду в будущем избегать)))
  • 0

#7 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 04 апреля 2011 - 07:40

1. Научить разработчиков делать человеческие ID даже в этом случае.
2. Поискать другие способы локейтить. Их много, потому без кода странички оно как-то не очень понятно какой лучше/удобнее. Да и без постановки задачи тоже.
  • 0

#8 Helenka

Helenka

    Новый участник

  • Members
  • Pip
  • 27 сообщений
  • ФИО:Elena

Отправлено 04 апреля 2011 - 08:36

1. вариант с разработчиками, к сожалению, не пройдет (((
2. Постановка задачи:
Надо в таблице найти по имени (например как в скриншоте "Alexandridis, Ben") соответствующую строку и radiobutton и активировать его.
Для нахожденя radiobutton можно использовать записанное ID (точнее те его части, которые остаются постоянными) и имя (н-р "Alexandridis, Ben").
  • 0

#9 vitorg

vitorg

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений

Отправлено 04 апреля 2011 - 12:26

Просто надо XPath по которому кликаем похитрее написать, типа такого: xpath=//tr[td[text()='Alexandridis, Ben']]/td[1]/input[@type='radio'].

А вообще по-моему стоит придерживаться стратегии: автотесты не должны влиять на тестируемый код. Т.е. просить разработчиков писать код иначе, ссылаясь на ограничения своего инструмента - это плохо, тем более, что у Selenium в этом смысле практически нет ограничений.
  • 0

#10 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 05 апреля 2011 - 03:41

Писать плохие локаторы просто потому что других никак не получается это верный путь к плохо поддерживаемым тестам. Может я не прав, но обычно так получается. К тому же для части софта локаторы по тексту это натуральное самоубийство, потому что локализация. И в общем-то работы для разработчика тут не сильно много как правило (можно и самим проставить, если уж совсем приперло), а на выходе получаем человеческие тесты, а не набор костылей.
  • 0

#11 Helenka

Helenka

    Новый участник

  • Members
  • Pip
  • 27 сообщений
  • ФИО:Elena

Отправлено 05 апреля 2011 - 07:03

Объясните, пожалуйста, для еще совсем "зеленых" в тестировании, чем так плоха локализация по тексту. Я пишу диплом по этой теме, и разработка автоматизированных тестов - его часть.
И хотелось бы еще узнать ваше мнение по этому поводу: мои тесты извлечены из программы и хранятся в виде XML-файлов, программа грузит эти тесты, parser считывает и выполняет соответствующие команды. Сделано это - чтобы облегчить поддержку тестов - через редактирование XML, а не кода программы. Записал тест на IDE, трансформировал его в XML, добавил псевокод. Так как тестируемое приложение в будущем будет еще дорабатываться и переделываться, необходимы тесты, которые бы легко поддерживались. Дополнительные операции, которых нет в selenium, добавляются к xml вручную как псевдокод (например создание определенного состояние базы данных (fixture)). Тестовые данные хранятся тоже в отдельных xml-файлах.

Кусочек тестового файла:
<selenese>
<command>type</command>
<target><![CDATA[jsf111:defaultForm:import:defaultForm:vorname0]]></target>
<value><![CDATA[$kind/vorname]]></value>
</selenese>
Недеюсь у меня получилось донести идею.
  • 0

#12 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 05 апреля 2011 - 07:17

Писать локаторы с привязкой ко внутреннему тексту контрола плохо потому что текст может меняться. При этом то может быть корректным поведением SUT.

Собственно примеры:
1. Локализация (очень не круто когда вы не можете легко взять и прогнать те же тесты под другой локалью).
2. Минорные изменения в приложении (кнопку переименовали с OK на Confirm - ловите false positive). В вашем случае поменяете формат вывода имени/фамилии и уже оп-па. А если она еще и настраиваемой станет, то количество го... не очень хорошего кода вырастет в разы.
3. Кроссбраузерность

Это все лечится. Риски минимизируются. Но все равно это костыли которых можно избежать обеспечив Testability продукта.

Вот еще можно почитать для общего развития почему лучше все же человеческие id получать/делать: http://blogs.atlassi...n_worth_it.html


Про поддержку и прочее - не нужно городить огород с псевдокодом и xml. Лучше сразу переходите на Selenium RC и там делайте человеческий код тестов с человеческой же структурой.
  • 0

#13 Helenka

Helenka

    Новый участник

  • Members
  • Pip
  • 27 сообщений
  • ФИО:Elena

Отправлено 05 апреля 2011 - 07:30

Дело в том, что на selenium RC переход уже совершен. Parser (java) считывает команды и отправляет их SeleniumRC. Тесты только находятся вне приложения.
  • 0

#14 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 05 апреля 2011 - 07:44

BDD?
  • 0

#15 Helenka

Helenka

    Новый участник

  • Members
  • Pip
  • 27 сообщений
  • ФИО:Elena

Отправлено 05 апреля 2011 - 08:01

BDD = Behavior driven development?
  • 0

#16 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 05 апреля 2011 - 08:04

Угу. Я просто не очень понимаю зачем иначе такое городить)
  • 0

#17 Helenka

Helenka

    Новый участник

  • Members
  • Pip
  • 27 сообщений
  • ФИО:Elena

Отправлено 05 апреля 2011 - 08:14

Потому что руководители такого мнения, что тесты и последовательность действий селениума не должна быть "hard coded". Чтобы в любой момент с помощью обычного текстового редактора можно было подправить тесты или дописать новые, не компилируя и не деплоя тестовое приложение заново. Как-то так.
  • 0

#18 OVA

OVA

    Опытный участник

  • Members
  • PipPipPipPip
  • 405 сообщений
  • ФИО:Высоцкий Сергей Павлович
  • Город:Новосибирск

Отправлено 05 апреля 2011 - 08:33

Оу. Ну просто проще написать кучу библиотечек для тестов, а потом уже писать код тестов. Они в идеале будут не сильно отличаться внешне от API тестов и можно будет ко всему еще наслаждаться всякими TestNG без плясок с бубном.

И да, тестовое приложение это Sistem Under Test или что?
  • 0

#19 Helenka

Helenka

    Новый участник

  • Members
  • Pip
  • 27 сообщений
  • ФИО:Elena

Отправлено 05 апреля 2011 - 09:03

Не, тестовое приложение - это моя программка, которая тестирует System Under Test
  • 0

#20 enki86

enki86

    Постоянный участник

  • Members
  • PipPipPip
  • 231 сообщений


Отправлено 08 апреля 2011 - 05:15

ересь какая-то... :focus:
зачем заново придумывать dependуncy injection ?
Куча хороших фреймворков, которые уже написаны, опробованы и хороши настолько, что ими пользуются. Возьмите хотя бы тот же TestNG для java. Парсер - это лишняя нагрузка и замедление работы тестов.

Зачем?
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных