Есть два запроса
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’] ??
//[text()=‘ddd’]/ancestor:://*[text()=‘settings’]
Так находит все элементы ‘settings’ по всему дому (к примеру их 2)
Необходимо подниматся по дому и остановится если найден один элемент…
Может такого и нет.
Как вариант написать функцию подстановки с перебором значений “…//”, потоом “…//…//” (если ответ не пустой то остановится). но возможно есть более простое решение.
П.С. Может не так в начале вопрос задал
//[text()=‘Client1’]//…//[text()=‘settings’]
//[text()=‘Client2’]//…//…//…//…//…//[text()=‘settings’]
Это разные клиенты, в разных блоках\таблицах, но элемент кнопки настроек у него одинаковый. Соответственно нужно что б нашло кнопку settings как в 1, так и во втором случае, но универсальным шагом
"//*[@class=‘chanIco ng-star-inserted’ and .//*[text()=’" + client + "’]]"
Ищем какой-то элемент с классом “chanIco ng-star-inserted” и у которого где-то есть дочерний элемент с текстом client.
То есть суть в том, что в квадратных скобках можно в качестве условия вставить поиск дочернего элемента. Только нужно обязательно ставить точку, иначе поиск этого дочернего элемента пойдет по всей странице