Python Selenium находит элемент с динамическим идентификатором

#python #selenium #element

Вопрос:

Я разработал скрипт на Python, который удаляет веб-сайт и заполняет некоторые сведения о пользователях. Это было довольно просто, так как веб-сайт предлагал конкретный идентификатор для каждого из необходимых мне элементов. Теперь они развернули обновление, которое изменило интерфейс, и все текстовые поля имеют динамические идентификаторы (они различаются между каждым из них и меняются при обновлении страницы).

Я попытался найти селектор CSS, не работает. ПОЛНЫЙ XPATH бесполезен, потому что, если они изменят divs или что-то в этом роде, ничего не будет работать. Я тоже не могу найти их по тексту… Это их страница и HTML-код

введите описание изображения здесь
введите описание изображения здесь

Мне нужно заполнить Имя/Фамилию/адрес электронной почты, но, как вы можете видеть, они имеют один и тот же ТИП и один и тот же КЛАСС, и их идентификаторы являются случайными, оба начинаются с ввода.

Мне удалось найти первый, ввести какой-то текст, затем нажать X вкладок, чтобы просмотреть их.

 browser.find_element_by_class_name('input').send_keys('MICHAEL')
actions.send_keys(Keys.TAB)
actions.perform()
actions.send_keys('FULKE')
actions.perform()
 

Могу ли я каким-либо образом указать непосредственно на определенные текстовые поля? Я не могу просто прокручивать их с помощью вкладки (возможно, они меняют свое положение/порядок)…

Любая помощь будет очень признательна

Комментарии:

1. Возможно, индексация xpath может нам помочь, пожалуйста, поделитесь HTML в текстовом формате для дальнейшего анализа.

2. Можете ли вы опубликовать HTML вместо изображения?

3. Я сделал это. Я добавил новый комментарий к этому вопросу.

Ответ №1:

 <div class="form-field__label" data-v-78510568=""> First Name <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_vlcbo61z5" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Website <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_umpb7xvn9" type="text" class="input" placeholder="www.website.com" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Last Name <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_g9tlbt7dt" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Phone <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_sfurpm31l" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Email <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_75ko5w3cw" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Fax <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_noz2c1g4a" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Job Title <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_w7p0iec5u" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div></div><h2 class="text text_h2 user__add-subtitle" data-v-73655104="" data-v-5890f98b="">Groups</h2><div class="grid-container" data-v-963e69fe="" data-v-5890f98b=""><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><!----><div class="form-field__control" data-v-78510568=""><div class="input-tags" data-v-2af32715="" data-v-5890f98b=""><div class="input-tags__field" data-v-2af32715=""><input id="input-tags_folh9wox7" type="text" placeholder="" autocomplete="off" class="input-tags__control" data-v-2af32715=""></div></div></div><!----></div> 

Я нашел один способ: используя browser.find_element s_by_class_name, а затем используйте этот список, чтобы захватить [0], [2], [4] (которые являются именем/фамилией/электронной почтой)… но опять же, это безумие?!

Ответ №2:

Есть много способов сделать это. Лучший способ работы с динамическими идентификаторами-это … не работать с динамическими идентификаторами. Это требование, которое мы часто выдвигаем при автоматизации тестовых случаев пользовательского интерфейса.

Однако некоторые из них могут быть динамичными. В этих случаях лучше всего иметь стабильные локаторы, которые не требуют особого обслуживания.

Как нам это сделать?

Паттерн-соответствие определенным атрибутам:

 //div[contains(@text,'First Name')]/../div[contains(@class,'control')]/input
 

При этом выбирается раздел, содержащий соответствующий текст, поднимается на один элемент (необходимо сопоставить текстовое поле для каждого конкретного элемента, предполагая, что они соответствуют аналогичной структуре), а затем сопоставляет ввод внутри элемента управления.

Группировка всех элементов и зацикливание по местоположению на странице

Вы можете захватить все входные данные и просмотреть их 🙂

 (//input)[0] # will select the first index (First Name), [1] second, etc.