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

Поиск элемента с несколькими значениями в атрибуте

xpath
locators
webdriver
selenium
Теги: #<Tag:0x00007f21d90f73d0> #<Tag:0x00007f21d90f71a0> #<Tag:0x00007f21d90f7060> #<Tag:0x00007f21d90f6e30>

(Алексей Павлов) #1

Привет.
Если атрибут содержит более одного значения:

<div class="row-type ng-star-inserted">

То как можно найти его selenium’ом? Как должен выглядеть xpath селектор?


(Viktor) #2

для поиска по всему содержимому класса
//*[@class='row-type ng-star-inserted']

или для частичного
//*[contains(@class, 'ng-star-inserted')]


(Алексей Павлов) #3
  1. Так не подойдёт. потому что ng-star-inserted может не быть при следующем запуске (т.е. будет просто class=“row-type”
  2. Так не подойдёт, потому что могут быть элементы со значением например “ng-star-inserted-content” и они будут найдены вместо нужного

(Viktor) #4

Можно добавить исключения
//*[contains(@class, ‘ng-star-inserted’) and not(contains(@class, ‘content’))]


(Алексей Павлов) #5

Вариант)
А попроще никак нельзя? Неужели в Selenium’е нет встроенных средств для работы с этим?
Это же попадается повсеместно


(Alexandr D.) #6

Проще можно только если кооперироваться с разработчиками или иметь доступ с исходному коду и проставить самому @id элементам.


(Алексей Павлов) #7

:frowning:


(Viktor) #8

Может быть,
Также можешь выбрать атрибуты class у найденных селениумом элементов при помощи селектора выше, и получить нужный элемент средствами своего языка программирования, например, значение класса разбить на лист по пробелам, а потом выбрать тот элемент, лист которого содержит нужный класс
Сомневаюсь что это проще), но это буде средствами селениума


(Oleksandr Khotemskyi) #9
div.row-type.ng-star-inserted

(Oleksandr Khotemskyi) #10

В этом случае нужно привязыватся к чему то другому

Но если очень хочется -

div.row-type.ng-star-inserted,div.row-type

Найди элемент див с классами row-type и ng-star-inserted или элемент div с классом row-type


(Алексей Павлов) #11

Это где задаётся в таком виде?


(Oleksandr Khotemskyi) #12

это css selector обычный - https://www.w3schools.com/cssref/css_selectors.asp


(asolntsev) #13

Для этого лучше использовать не xpath, а css селектор. Примерно так:

$(".row-type.ng-star-inserted").shouldHave (text("траляля"));

(Desalvo Dimon) #14

Добрый день, попробуйте так

//div[contains(@class,'row-type') and contains(@class,'ng-star-inserted')]

(Oleksandr Khotemskyi) #15

С таким селектором мы получим ложноположительное срабатывание в случае вроде такого

<div class="selected-row-type ng-star-inserted">


(Desalvo Dimon) #16

Не проблема)))

//div[contains(@class,'row-type') and contains(@class,'ng-star-inserted') and not(contains(@class,'selected')] 

(Oleksandr Khotemskyi) #17

Ну так можно до бесконечности писать not в селекторе, вместо простого и понятного
div.row-type.ng-star-inserted