Я пытаюсь протестировать сложный интерфейс javascript с Selenium (используя интерфейс Python и через несколько браузеров). У меня есть несколько кнопок формы:
<div>My Button</div>
Я хотел бы иметь возможность поиска кнопок на основе «Моя кнопка» (или не учитывающих регистр, частичных совпадений, таких как «моя кнопка» или «кнопка»)
Я нахожу это удивительно трудным, до такой степени, что я чувствую, что упускаю что-то очевидное. Лучшее, что у меня есть, это:
driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')
Это чувствительно к регистру, однако. Другая вещь, которую я пробовал, - это перебирать все элементы div на странице и проверять свойство element.text. Тем не менее, каждый раз, когда вы получаете ситуацию в форме:
<div class="outer"><div class="inner">My Button</div></div>
У div.outer также есть «Моя кнопка» в качестве текста. Чтобы исправить это, я попытался выяснить, является ли div.outer родителем div.inner, но не смог понять, как это сделать (element.get_element_by_xpath ('..') возвращает родителя элемента, но это тесты не равны div.outer). Кроме того, итерация по всем элементам на странице кажется очень медленной, по крайней мере с использованием веб-драйвера Chrome.
Идеи?
Изменить: этот вопрос вышел немного расплывчатым. Спросил (и ответил) более конкретную версию здесь: Как получить текст элемента в Selenium WebDriver (через API Python) без включения текста дочернего элемента?
источник
Ответы:
Попробуйте следующее:
источник
find_element(s)_by_link_text
иfind_element(s)_by_partial_link_text
методыВы можете попробовать xpath как:
источник
.format
не узнается в моем затмении это дает и ошибка. любая идея, почему?Вы также можете использовать его с шаблоном объекта страницы, например:
Попробуйте этот код:
источник
// * будет искать любой тег HTML. Где, если какой-то текст является общим для кнопки и тега div, а если // * - категории, он не будет работать должным образом. Если вам нужно выбрать какой-то конкретный объект, вы можете получить его, объявив тег HTML-элемента. Подобно:
источник
Интересно, что практически все ответы вращаются вокруг функции xpath
contains()
, игнорируя тот факт, что она чувствительна к регистру - вопреки запросу OP.Если вам нужна нечувствительность к регистру, это достижимо в xpath 1.0 (версия, поддерживаемая современными браузерами) , хотя это и не красиво - с помощью
translate()
функции. Он заменяет исходный символ в его желаемой форме, используя таблицу перевода.Построение таблицы всех символов в верхнем регистре будет эффективно преобразовывать текст узла в его нижнюю () форму - позволяя сопоставление без учета регистра (вот только прерогатива) :
Полный вызов Python:
Естественно, у этого подхода есть свои недостатки - как дано, он будет работать только для латинского текста; если вы хотите охватить символы юникода - вам придется добавить их в таблицу перевода. Я сделал это в примере выше - последний символ - это символ кириллицы
"Й"
.И если бы мы жили в мире, где браузеры поддерживали xpath 2.0 и выше (🤞, но скоро это не произойдет ☹️) , мы могли бы использовать функции
lower-case()
(пока не полностью ориентированные на локали), иmatches
(для поиска регулярных выражений, с case -insensitive ('i'
) флаг).источник
В HTML, который вы предоставили:
Текст
My Button
являетсяinnerHTML
и не имеет пробелов вокруг него, так что вы можете легко использоватьtext()
следующее:Текст с начальными / конечными пробелами
Включите соответствующий текст, содержащий пробелы в начале:
или в конце:
или на обоих концах:
В этих случаях у вас есть 2 варианта:
Вы можете использовать
contains()
функцию, которая определяет, содержит ли строка первого аргумента строку второго аргумента, и возвращает логическое значение true или false следующим образом:Вы можете использовать
normalize-space()
функцию, которая удаляет начальные и конечные пробелы из строки, заменяет последовательности пробельных символов одним пробелом и возвращает полученную строку следующим образом:xpath для переменной Text
Incase the text - это переменная, которую вы можете использовать:
источник
источник
Аналогичная проблема: Найти
<button>Advanced...</button>
Возможно, это даст вам некоторые идеи (пожалуйста, перенесите концепцию с Java на Python):
источник
Используйте driver.find_elements_by_xpath и спички Regex соответствия функции для случая нечувствительного поиска элемента по его тексту.
источник
matches()
является функцией xpath 2.0, и браузеры, к сожалению, поддерживают только 1.0.Попробуй это. Это очень просто:
Это действительно работает для меня в веб-драйвере селена.
источник