Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Не находит по xPath-у, хотя на странице он есть

xpath
java
webdriver
Теги: #<Tag:0x00007f7b64957e78> #<Tag:0x00007f7b64957e28> #<Tag:0x00007f7b64957c98>

(Denis Vovchenko) #1

Проблема такого рода, есть xPath (Так как html генерируется автоматом и криво + динамические ID) ищу способ сократить и оптимизировать локаторы.
Пока что пришел только к такому виду

   driver.findElement(By.xpath("//a[text()=' Настройка услуг ']")).click();

И при этом выдает ошибку, вот такого рода:

    org.openqa.selenium.InvalidSelectorException: The xpath expression '//a[text()=' пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ ']' cannot be evaluated or does notresult in a WebElement (WARNING: The server did not provide any stacktrace information)

Thread.sleep(3000) уже ставил, не помогает


(Maksym Polynskyi) #2

Кирилица не нравится может?


(Руслан) #3

тут слип ничем не поможет, подберите другой локатор, желательно на латинице(соглашусь с постом выше)


(Denis Vovchenko) #5

Я б с удовольствием, но с таким DOM-ом это не просто:

<div class="GIAU1ENBMO GIAU1ENBNO" style="position: absolute; left: 0px; top: 0px; right: 0px; bottom: 0px;">
<div style="position: absolute; z-index: -32767; top: -20ex; width: 10em; height: 10ex; visibility: hidden;" aria-hidden="true"/>
<div style="position: absolute; overflow: hidden; left: 0px; top: 0px; right: 0px; bottom: 0px;"><div id="gwt-uid-30" class="accordion" style="position: absolute; left: 0px; top: 0px; right: 0px; bottom: 0px;"><div class="accordion-group" style="">
<div class="accordion-heading selected-menu-item">
<a id="gwt-uid-32" class="accordion-toggle collapsed" href="#gwt-uid-31" data-toggle="collapse" data-parent="#gwt-uid-30">
<i class="icon-folder-open"/> Настройка услуг </a></div>

Все ID динамические, и атрибуты скачут постоянно.
И даже если искать по статическому атрибуту, то зачастую на ходит больше 1-го. Пока приходится писать xPath-ы типа:

//div[2]/div[4]/div//div[2]//div/table/tbody/tr[3]

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


Тесты периодически падают. Почему же?
(5am) #6

можно попробовать искать от соседних элементов, например:

//a[contains(@class, 'accordion-toggle')]
//i[@class='icon-folder-open']

либо, как уже говорилось, можно попросить разработчиков добавить уникальных индификаторов (уникальный текст в @id, @class, etc) для элементов


(Руслан) #7

по рукам таким разработчикам))
ради интереса может глянуть, что selenium IDE за набор локаторов выдаст, если вручную тяжеловато


(Максим Малунов) #8
пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ ']' cannot be evaluated or does notresult in a 

Кирилица не нравится может?      

Кто-нибудь знает как это фиксаеться ?
Code page ?
или в проэкте настройки ?


(5am) #9

если тестируемая система имеет несколько локализаций - то подобные локаторы будут работать только на одной локале.


(Denis Vovchenko) #11

IDE выдает все варианты привязаны к id, только xpath:position выдает (похожий)как у меня

  //div[2]/div/div/div/a

(Denis Vovchenko) #12

Это я знаю. Это я так ищу какие варианты пока возможны.


(vmaximv) #13

Предлагаю топик-стартеру проверить например такой локатор //*[1] и, естественно, в том браузере, в котором он получил этот экcепшен (то бишь IE).


(Vitalii Grygoruk) #14

Неплохо было бы глянуть на кодировку текста исходников проекта (в частности файла в котором встречается кириллица)


(Антон) #15

Если проблема с кодировкой и xpath не хочет воспринимать кирилицу то можно попробовать сделать метод, который будет принимать текст, искать все элементы через findElements, удовлетворяющие xpath:

А потом через перебор возвращать тот, который содержит твой текст, а может и кликать :smile:
p.s. Кстати может оказаться так что тебе нужно будет кликать не на ссылку, а на иконку.