t.me/atinfo_chat Telegram группа по автоматизации тестирования

Проблема с определением локаторов элементов


(animanera) #1

Пользуюсь Selenium недавно, возникли сложности с определением локаторов некоторых элементов. Имеется страница с различными выпадающими окнами, которые все имеют практически идентичные id вида "выпадающее_меню_№"), где номер генерится при создании страницы и через раз меняется. Поэтому при создании xpath вида "//ul[contains(@id,'выпадающее_меню')] идет обращение к первому же такому элементу. Полностью прописать путь тоже не удается, т.к. он во всех случаях выглядит наподобие //html/body/div[№]/ul, и номер опять-таки изменяется. Вообще все вложения генерятся по единому принципу и различаются только этими номерами. Я пока еще новичок в этом вопросе, поэтому прошу совета, как можно выйти из данной ситуации. Заранее спасибо.


(Mykhailo Poliarush) #2

укажите пожалуйста пример кода нескольиких выпадающих списков и какой елемент выхотите найти


(animanera) #3

Нужно обратиться как и к <div> и ко всем элементам внутри него

...

<div id = "bla_№1" ... >

      <ul id = "bla_bla_№1" ...>

          <li id = "bla_bla_bla_№1_1"...>Option1</li>

          <li id = "bla_bla_bla_№1_2"...>Option2</li>

           ...

          <li id = "bla_bla_bla_№1_N"...>OptionN</li>

      </ul>

</div>

...

<div id = "bla_№2" ... >

      <ul id = "bla_bla_№2" ...>

          <li id = "bla_bla_bla_№2_1"...>Option1'</li>

          <li id = "bla_bla_bla_№2_2"...>Option2'</li>

           ...

          <li id = "bla_bla_bla_№2_N"...>OptionN'</li>

      </ul>

</div>


(Mykhailo Poliarush) #4

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

//div[//li[text()='Option1']]

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

также можно привязаться к индексу если место расположение списка не меняется (не рекомендуемо)


(animanera) #5

Спасибо большое! //div[//li[text()='Option1']] решает проблему с однозначным выбором пунктов списка (хоть текстом они всегда отличаются, что-то приятное).

К индексам привязаться, к сожалению, невозможно, т.к. они тоже смещаются.

Осталось придумать, как обратиться к самому окну, в котором расположены пункты (к тому, что в <ul>). Из атрибутов окна отличаются только размерами, этим можно воспользоваться? Сразу прошу прощения, если вопросы глупые, занимаюсь этим увлекательным занятием всего третий день.


(Mykhailo Poliarush) #6

поправьте меня если я не прав, если вы имеете ввиду li елементы, то это можно сделать так

//div[//li[text()='Option1']]//li



(animanera) #7

С <li> проблема решена, благодаря вашему совету, сейчас я имею в виду <ul>.


(Mykhailo Poliarush) #8

точно также 

//div[//li[text()='Option1']]//ul


(animanera) #9

Правильно ли я понимаю, что в этом случае он обращается к елементу <ul>, содержащему в себе элемент <li> с заданным текстом? (просто пока я не очень хорошо ориентируюсь в способах задания пути)

Способ работает, сижу не нарадуюсь.


(Mykhailo Poliarush) #10

да вы правильно понимаете, кстати, можно упростить xpath если вам надо обращаться к ul

//ul[li/text()="Option1"]


(animanera) #11

Да, в процессе я так и попробовала.

Спасибо за помощь, очень долго бы разбиралась во всем этом самостоятельно.


(Mykhailo Poliarush) #12

на то и форум, чтобы вам помочь.

обращайтесь