Как правильно хранить одинаковые/повторяющиеся локаторы

Понимаю что подобные темы обсуждались уже не раз, но для меня этот вопрос по прежнему не решен.
У меня есть 40 страниц, на каждой из страниц около 25-40 локаторов, которые повторяются с небольшим отличием на каждой странице.
Пример:
Name - на всех страницах
Internal ID - на всех
External ID - на 38 из 40
Description - на 30 из 40
Text - на 30 из 40
Name in reports - на 25 из 40
Services - на 25 из 40
Functional - на 22 из 40
Network - на 20 из 40
Recommended - на 20 из 40
И далее в подобном ключе.
Проблема локаторов подобных “Recommended” и “Network” в том что они могут быть на разных на разных страницах вместе и по отдельности, а могут и не быть , т.е.:
На одной странице может быть: Name, Int.ID, Ext.ID, Description, Recommended и Functional
На второй может быть: Name, Int.ID, Ext.ID, Text, Network, Recommended и Services
На третьей может быть: Name, Int.ID, Ext.ID, Name in reports, Network, Services, Functional итд
Явного наследования не построить, либо структура наследования будет громоздкой и очень запутанной.
Как бы вы реализовали запись локаторов? Дублировать и писать их на каждой странице? Наследование? God class с большинством локаторов? Ваши варианты

Для каждой страницы свои локаторы. Привяжитесь к одной странице а вдруг она поменяется, а вы от нее наследовались?) Наследовать стоит локаторы только для фреймов, вкладок и т.п. Чуть больше писанины, за то надежнее. В конце концов копипаст + замену по файлу никто не отменял :smile:

В таком случае только константы тебе помогут.

Привет @SaneQ,

Я не владею информацией о структуре вашего приложение, так же как и о языке на котором вы автоматизируете, поэтому могу дать только общий совет.

Там где есть наследование – можно упомянть композицию (агрегирование). Смысл в том, что некоторую логическую часть страницы, вы можете выделить в отдельный класс и сделать это компонентом. Так если у вас повторяется Name, Internal ID, Description, Text вместе – то можно выделить это отдельным классом и назавать GeneralInfo, например. Для отдельных случаев можно создать отдельные классы.
Эти классы могут отвечать за заполнение и проверку полей.

А может быть у вас удастся придумать универсальный локатор для всех полей? У XPath для этого достаточно широкие возможности.

Если таких полей не много, то и наследование сойдет.

Кроме того, у класса наследника, всегда есть возможность переопределить поведение (или поле) базового класса.

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

Если же страницы создавались копи-пастом, то возможно придется создавать каждую страницу уникально, тем же методом.

1 лайк

Язык - java, автоматизирую на Selenium WebDriver.
Сайт состоит из множества похожих форм, все локаторы текстовые поля и уже реализован метод FillForm, который проходится по всем локаторам в классе и заполняет их на странице. Если указать лишний локатор, то появится ошибка, потому что FillForm его не обнаружит на странице.