Как найти элементы по тексту или value методами селенида?

Доброго времени суток! Подскажите пожалуйста, как методами селенида найти на странице элементы, у которых есть определённое текстовое или value значение?
С помощью xpath это реализуется

//*[contains(normalize-space(text()), '%1$s') or contains(normalize-space(@value), '%1$s')]

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

tableRaw.shouldHave(or("text", text(value), value(value))).isDisplayed() 

текст находит, а value пытается найти не у вложенных элементов, а у самого тега tr. Как искать у вложенных так и не разобрался, потому что or требует тип Condition, не понял, как увязать поиск дочерних элементов и привести их к условию.
Так же не смог найти материала по Condition.or, что за строку сначала нужно ввести, взял из какого-то единственного примера, который нашел в интернете.

$.shouldHave(text(“text”);
$.shouldHave(attribute (“attribute Name”, value));
$.shouldHave(cssValue(“value”));

На стартовой Selenide есть примеры. Почитай)

Я бы выбрал ваш вариант через xpath - как минимум он самый быстрый.

Средствами селенида это можно сделать примерно так:
tableRaw.findAll(“td”).filter(or(“text”, text(value), value(value))

Но это по-любому будет медленнее, чем xpath.

P.S. Не забудьте учесть случаи, когда в текстовом значении есть одинарные кавычки - тогда ваш xpath будет невалидным.

1 симпатия

Спасибо! Но получается, использование xpath предпочтительнее, т.к. быстрее? Или это только для данного случая? Просто находил в интернете статьи, где люди говорили, что использовать xpath это последнее дело и надо стараться в первую очередь пользоваться методами селенида, т.к. читаемость и универсальность выше

Интересно, где можно найти такие статьи? :slight_smile:

Зависит.
Можно и xpath написать читабельный, а можно и на селениде наговнокодить.

В данном случае - xpath лучше, потому что быстрее. А быстрее он потому, что найдёт нужные элементы за одно обращение к вебдрайверу.

А строчка типа tableRaw.findAll(“td”).filter(or(“text”, text(value), value(value)) будет много раз обращаться к вебдрайверу: сначала получить список элементов, потом в цикле для каждого элемента его текст, его значение… А каждый вызов вебдрайвера занимает несколько десятков миллисекунд. Может, это и не будет заметно, если элементов не много. Но бывает, что их много - скажем, сотня - тогда разница уже будет чувствоваться.

В общем, в каждом случае надо смотреть по обстоятельствам.

1 симпатия

Спасибо за объяснение! Не помню где читал, может быть даже и на заборе))) Пруфы пока предоставить не могу, быстрым поиском не нашел)