Поиск по тексту, как мне кажется не всегда хорошая мысль. И в данном случае, с учетом планов, текст будет вероятно изменен и приложение будет поддерживать локализацию на разные языки. Хотелось бы какой-нибудь универсальный локатор.
Какие вообще существуют способы локации элементов, когда имена классов представлеы подобным образом
class="jss180 jss1231 jss1234 Tabs-tab-1jFd9"
А ID или Name элементов отсутствуют. А если и присутствуют, то очень сильно похожи на автосгенеренные
id="jw1zpi0t"
На проекте все написано в подобном стиле и все элементы лоцировать по тексту мне кажется ужасная мысль.
Кроме как по тексту не получится. Можно добавить строку для родительского элемента для надёжности.
Вот так: //div[contains(@class, 'Tabs-items-container')]//span[contains(@class, 'Tabs-label-container')]/span[text()='<текст кнопки>']
Если нет Id, возможно такой вариант подойдет. Но нет гарантии. Если еще один элемент добавится перед - нужно будет менять поиск опять
//div[@class=‘jss1223 Tabs-items-container-3SpWT jss1224’]//span[1]
ну тут только по тексту или по индексу можно опять же привязаться к рутовому элементу и все еще исктаь по тексту, в случае добавлеия локализации просто добавить оператор “or”
А вы не пробовали поговорить с девелоперами на тему добавления дополнительного атрибута к вэбэлементам.
Например, в вашем случае это кнопки. Можно сделать примерно так
Цитата
Можно добавить строку для родительского элемента для надёжности.
Вот так: //div[contains(@class, 'Tabs-items-container')]//span[contains(@class, 'Tabs-label-container')]/span[text()='<текст кнопки>']
Подстроки ‘Tabs-items-container’ и ‘Tabs-label-container’ скорее всего в классе элементов будут единственной неизменной частью.
На счёт поиска по тексту элемента:
В этом нет ничего плохого. Но вы сможете реализовать метод, который по названию нажмёт нужную кнопку меню, например:
Тесты планируются для каждой локализации? Если да, то можно параметризировать (надеюсь я правильно написал слово) его, сделать метод, который принимает текст, соединяет его с селектором, и находит элемент, возвращает его, и вы уже дальше работаете с ним.
Еще один из вариантов - взять задефенировать кнопку по ее номеру. Но это будет работать лишь в том случае, если место положение кнопок не будет меняться, или будет очень редко меняться.
Если есть изменяемая часть - можно взять ту часть, которая не меняется и использовать contains. На счёт использования имени- тоже не гарантия успеха. Бывает элементы с одинаковым текстом или совсем без текста.