Можно ли сделать универсальный поиск по XPath?

Всем привет.

Есть два запроса
driver.findElement(By.xpath("//[text()=’" + client + "’]//…//[@class=‘chanIco ng-star-inserted’]")).click()
и
driver.findElement(By.xpath("//[text()=’" + client + "’]//…//…//…//…// [@class=‘chanIco ng-star-inserted’]")).click()

Они отрабатывают корректно… но…

Хотелось бы сделать один универсальный шаг (Использую Cucumber)
Есть ли возможность заменить //…//…//…//…//* на какой-то аналог “descendant::” который будет подниматся по дереву пока не найдет нужную сущность [@class=‘chanIco ng-star-inserted’] ??

http://wiki.umisoft.ru/Оси_языка_Xpath

ancestor:: — Возвращает множество предков.

//[text()=‘ddd’]/ancestor:://*[text()=‘settings’]
Так находит все элементы ‘settings’ по всему дому (к примеру их 2)
Необходимо подниматся по дому и остановится если найден один элемент…
Может такого и нет.
Как вариант написать функцию подстановки с перебором значений “…//”, потоом “…//…//” (если ответ не пустой то остановится). но возможно есть более простое решение.

П.С. Может не так в начале вопрос задал

  1. //[text()=‘Client1’]//…//[text()=‘settings’]
  2. //[text()=‘Client2’]//…//…//…//…//…//[text()=‘settings’]
    Это разные клиенты, в разных блоках\таблицах, но элемент кнопки настроек у него одинаковый. Соответственно нужно что б нашло кнопку settings как в 1, так и во втором случае, но универсальным шагом :slight_smile:
  1. можно найти список элементов и обработать каждый элемент
  2. можно накрутить селектор, чтобы он искал именно то, что вам нужно

"//*[@class=‘chanIco ng-star-inserted’ and .//*[text()=’" + client + "’]]"

Ищем какой-то элемент с классом “chanIco ng-star-inserted” и у которого где-то есть дочерний элемент с текстом client.

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