Перейти к содержимому

Фотография

Поиск элемента с помощью xpath


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 Artem26

Artem26

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Варнавский Артем Геннадьевич

Отправлено 04 декабря 2017 - 18:06

Всем добрый вечер. Возникла проблема. Я хочу найти с помощью xpath кнопку "Добавить кредит" по тексту. Делаю это следующим образом: //div[contains(text()='Добавить кредит')] , либо //div[contains(text()='Добавить кредит')]. Также установлена  Capybara,  вот такой вариант работает исправно: click_button("Добавить кредит"). Но я хочу именно найти с помощью xpath, подскажите, что делаю не так ) 

Спасибо

Прикрепленные файлы

  • Прикрепленный файл  xpath.png   322,07К   2 Количество загрузок:

  • 0

#2 Artem26

Artem26

    Новый участник

  • Members
  • Pip
  • 15 сообщений
  • ФИО:Варнавский Артем Геннадьевич

Отправлено 04 декабря 2017 - 18:34

Наверное важно упомянуть. Автотесты разрабатываются с помощью selenium webdriver, cucumber.


  • 0

#3 Spock

Spock

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 772 сообщений
  • ФИО:Роман

Отправлено 04 декабря 2017 - 19:47

Там под DIV ещё как минимум один элемент
  • 0

#4 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 05 декабря 2017 - 06:42

Судя по вашему скриншоту, текст того дива не равен "Добавить кредит", он равен " Добавить кредит" (там по скрину - как минимум один пробел в начале). А Вы то ищете точное соответствие: text()='Добавить кредит', вот и не находит.

 

Если уж очень хочется именно так поискать, попробуйте //div[contains(text(),'Добавить кредит')]

 

//<элемент>[contains(<аттрибут>=<значение>)] => у элемента есть аттрибут равный указанному значению

//<элемент>[contains(<аттрибут>,<значение>)] => у элемента есть аттрибут, в значении которого содержится указанное значение


  • 1

#5 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 05 декабря 2017 - 07:09

А разве можно так писать ?

 

//<элемент>[contains(<аттрибут>=<значение>)] => у элемента есть аттрибут равный указанному значению

 

//div[contains(text()='Добавить кредит')] ,

Это же невалидный ХPath

Проверить можно в cтаром FF(там где есть Firebug c FirePath ) или в Хроме если набрать в консоли $x('тут храth')


  • 1

#6 TatyanaV

TatyanaV

    Опытный участник

  • Members
  • PipPipPipPip
  • 388 сообщений
  • ФИО:Воробьева Татьяна


Отправлено 05 декабря 2017 - 07:21

А, да, мой косяк, с равно не писала никогда, решила, что так у него работает, но из-за значения не ищет.

В любом случае - с запятой нужно contains использовать, иначе в нём нет смысла.


  • 0

#7 Alex_Alex

Alex_Alex

    Новый участник

  • Members
  • Pip
  • 3 сообщений
  • ФИО:Алексей
  • Город:Минск


Отправлено 18 июля 2018 - 17:16

Добрый день! 

Пол года назад начал изучать АТ как и Питон. Вроде как не плохо получается, но каждый день возникают вопросы на которые инет, либо не дает информацию, либо много противоречивой информации. В данный момент я написал тесты на проверку логирования и создания нового письма на gmail, yahoo и yandex. Недавно по Вашей ссылке посмотрел топик xpath vs css. Парень сделал тесты на которых показал преимущества xpath в скорости и в чем то еще, не помню, извинЯйте) так вот для создания письма на yandex.ru нужно нажать пимпку 'Написать' я создал три пути, уверен(sixth sense), что CSS оптимальный.

Почему? Какая разница между моими Xpath? Какой из них лучше, почему?

 

compose = driver.find_element(By.CSS_SELECTOR, ".mail-ComposeButton-Text")
compose = driver.find_element(By.XPATH, "//span[@class = 'mail-ComposeButton-Text' and text() = 'Написать']")
compose = driver.find_element(By.XPATH, "//span[@class = 'mail-ComposeButton-Text' and contains(text(), 'Написать')]")


  • 0

#8 Noksa

Noksa

    Активный участник

  • Members
  • PipPip
  • 117 сообщений
  • ФИО:Александр

Отправлено 19 июля 2018 - 05:41

compose = driver.find_element(By.XPATH, "//span[@class = 'mail-ComposeButton-Text' and text() = 'Написать']")
compose = driver.find_element(By.XPATH, "//span[@class = 'mail-ComposeButton-Text' and contains(text(), 'Написать')]")

Данные локаторы более подвержены поломке, нежели чем 

compose = driver.find_element(By.CSS_SELECTOR, ".mail-ComposeButton-Text")

Просто хотя бы потому, что текст может поменяться, либо поменяться язык, и локаторы сломаются. 

 

Так что привязываться к тексту стоит только в самом крайнем случае.


  • 1

#9 MissLeman

MissLeman

    Постоянный участник

  • Members
  • PipPipPip
  • 152 сообщений


Отправлено 19 июля 2018 - 07:14

Классы тоже лучше писать через contains, если это позволяет найти однозначное соответствие (не отвалится, если допустим к этим элементам кто-то применит какой-то еще класс).


  • 0

#10 Noksa

Noksa

    Активный участник

  • Members
  • PipPip
  • 117 сообщений
  • ФИО:Александр

Отправлено 19 июля 2018 - 07:39

А ещё лучше - просить разработчиков добавлять ID элементам. 
Тогда ваши локаторы всегда будут самыми лучшими, и короткими :)


  • 0

#11 user12

user12

    Специалист

  • Members
  • PipPipPipPipPip
  • 894 сообщений
  • ФИО:Виктор
  • Город:Минск


Отправлено 19 июля 2018 - 08:21

Ну и к всему вышеперечисленному, если надо искать по XPath

//span[@class = 'mail-ComposeButton-Text' and text() = 'Написать']

Пиши лучше так, т.к. банально короче

//span[@class = 'mail-ComposeButton-Text'][text() = 'Написать']


  • 0

#12 Alex_Alex

Alex_Alex

    Новый участник

  • Members
  • Pip
  • 3 сообщений
  • ФИО:Алексей
  • Город:Минск


Отправлено 19 июля 2018 - 14:55

Всем Спасибо за науку!

Еще один небольшой вопросик

Хочу проверить элемент профайла на yahoo ну и конечно ID не уникален (динамика)

 

<button id="yui_3_18_0_3_1531928188806_742" class="uh-menu-btn P(0) Bd(0) Pos®" aria-haspopup="true" aria-expanded="true" aria-label="Profile" tabindex="4" title="Profile" data-ylk="sec:hd;slk:profile;t1:a1;t2:hd;elm:btn;itc:1;" data-rapid_p="17">

 

//button[@class = 'uh-menu-btn P(0) Bd(0) Pos®' and @aria-label = 'Profile']

или всё же краткость сестра таланта

//button[@class = 'uh-menu-btn P(0) Bd(0) Pos®']

//button[@aria-label = 'Profile']

//button[@title = 'Profile']

а вот еще вариант, предыдущий тэг имеет статичный ID а потом просто прыгнуть вниз

//li[@id = 'uh-profile']/button

Это все работает и имеет по одному совпадению в firebugЕ

Объясните пожалуйста какой лучше и почему и какой\ие хуже и почему?

Спасибо!


  • 0

#13 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 19 июля 2018 - 18:58

Всем Спасибо за науку!

Еще один небольшой вопросик

Хочу проверить элемент профайла на yahoo ну и конечно ID не уникален (динамика)

 

<button id="yui_3_18_0_3_1531928188806_742" class="uh-menu-btn P(0) Bd(0) Pos®" aria-haspopup="true" aria-expanded="true" aria-label="Profile" tabindex="4" title="Profile" data-ylk="sec:hd;slk:profile;t1:a1;t2:hd;elm:btn;itc:1;" data-rapid_p="17">

 

//button[@class = 'uh-menu-btn P(0) Bd(0) Pos®' and @aria-label = 'Profile']

или всё же краткость сестра таланта

//button[@class = 'uh-menu-btn P(0) Bd(0) Pos®']

//button[@aria-label = 'Profile']

//button[@title = 'Profile']

а вот еще вариант, предыдущий тэг имеет статичный ID а потом просто прыгнуть вниз

//li[@id = 'uh-profile']/button

Это все работает и имеет по одному совпадению в firebugЕ

Объясните пожалуйста какой лучше и почему и какой\ие хуже и почему?

Спасибо!

Как по мне варианты с @class = 'uh-menu-btn P(0) Bd(0) Pos®' хуже, так как тут перечисление нескольких классов. Соответственно, вероятность поломки "локатора" выше.


  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных