У меня проблема с выбором узлов по атрибуту, когда атрибуты содержат более одного слова. Например:
<div class="atag btag" />
Это мое выражение xpath:
//*[@class='atag']
Выражение работает с
<div class="atag" />
но не для предыдущего примера. Как я могу выбрать <div>
?
div.atag
илиdiv.btag
. Супер просто, не соответствует строке, и ПУТЬ быстрее (и лучше поддерживается в браузерах). XPath (против HTML) должен быть отнесен к тому, что полезно для ... поиска элементов по содержанию текста и для навигации по DOM.Ответы:
Вот пример, который находит элементы div, чье className содержит
atag
:Вот пример, который находит элементы div, чье className содержит
atag
иbtag
:Тем не менее, он также найдет частичные совпадения, как
class="catag bobtag"
.Если вы не хотите частичных совпадений, см. Ответ Бобинса ниже.
источник
<div class="Patagonia Halbtagsarbeit">
, который содержит целевые строки, но не является div с заданными классами.Ответ mjv - хорошее начало, но не удастся, если atag - не первое имя класса в списке.
Обычный подход довольно громоздкий:
это работает до тех пор, пока классы разделены только пробелами, а не другими формами пробелов. Это почти всегда так. Если это не так, вы должны сделать его еще более громоздким:
(Выбор по строкам, подобным именам классов, является распространенным случаем, поэтому удивительно, что для него нет специальной функции XPath, как в CSS3 '[class ~ = "atag"]'.)
источник
попробуй это:
//*[contains(@class, 'atag')]
источник
grabatagonabag
? (Подсказка: все равно совпадет.)РЕДАКТИРОВАТЬ : см. Решение Бобинса, которое использует содержит, а не начать , а также хитрость, чтобы убедиться, что сравнение выполняется на уровне полного токена (чтобы шаблон «atag» не был найден как часть другого «тега»).
«atag btag» является нечетным значением для атрибута класса, но тем не менее попробуйте:
источник
2.0 XPath, который работает:
или с переменной:
источник
@class
имеет более одного элемента? Потому что он собирается вернуть список слов и сравнивать его со строкой не удастся с неправильным количеством элементов .//*[tokenize(@class)=$classname]
//*[@class=$classname]
Помните, что ответ Бобинса может быть слишком сложным, если вы можете предположить, что интересующее вас имя класса не является подстрокой другого возможного имени класса . Если это так, вы можете просто использовать сопоставление подстроки с помощью функции contains. Следующее будет соответствовать любому элементу, чей класс содержит подстроку 'atag':
Если приведенное выше предположение не выполняется, совпадение подстроки будет соответствовать элементам, которые вы не намереваетесь. В этом случае вы должны найти границы слова. Используя пробелы для определения границ имени класса, второй ответ Бобинса находит точные совпадения:
Это будет соответствовать
atag
и нетmatag
.источник
Чтобы добавить ответ Бобинса ... Если какой-либо инструмент / библиотека, которую вы используете, использует Xpath 2.0, вы также можете сделать это:
count (), очевидно, необходим, потому что index-of () возвращает последовательность каждого индекса, с которым у него есть совпадение в строке.
источник
$classname
переменную между кавычками? Потому что как есть, это строка.'$classname'
конечно.Вы можете попробовать следующее
By.CssSelector("div.atag.btag")
источник
Я пришел сюда в поисках решения для Ranorex Studio 9.0.1. Там еще не содержится (). Вместо этого мы можем использовать регулярные выражения, такие как:
источник
Для ссылок, которые содержат общий URL-адрес, необходимо указывать переменную. Затем попробуйте последовательно.
источник