Как различать элементы, содержащие один и тот же текст Python Selenium

#python #selenium #selenium-webdriver

Вопрос:

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

 search = input("Enter something to search for")
elem = browser.find_elements_by_xpath(f'//span[text()="{search}"]')
 

Существуют ли какие-либо советы по идентификации элементов в динамической среде? Я подумал, что, возможно, я мог бы идентифицировать элемент по двум критериям — например, по его соответствию тексту (как указано выше), но также и по атрибуту, которого нет у двух других элементов?

Поскольку он динамичен, не так много заданных атрибутов, на которых я могу основывать поиск (я не буду знать имя класса заранее или идентификатор). Единственное, что я могу придумать, чтобы добавить поверх сопоставления строк, — это текст внешнего класса, в котором он будет находиться, поскольку это согласуется со всеми поисками, которые я буду проводить, но я не уверен, возможно ли это?

Любые советы по идентификации элементов в динамичной среде приветствуются.

Xpath для трех элементов с точно таким же текстом являются:

 /html/body/div[3]/div/div/div[1]/div/div/div/div/div/div/div/div[2]/div/div[1]/li/button/span/ul/li/span[2]/span
/html/body/div[3]/div/div/div[1]/div/div/div/div/div/div/div/div[2]/div/div[2]/li[1]/a/span/ul/li[1]/span/span
/html/body/div[3]/div/div/div[1]/div/div/div/div/div/div/div/div[2]/div/div[2]/li[2]/a/span/ul/li[1]/span[1]/span
 

Пример одного из элементов (все они выглядят так):

 <span class="ccl-19882374e640f487 ccl-1daa0367dee37c3b">TEXT</span>
 

И тег h4 «заголовок», который находится над некоторыми соответствующими элементами:

 <h4 class="ccl-2a4b5924e2237093 ccl-21bead492ce4ada2 ccl-706ed5a06ead17d8 ccl-2b95b58eee016846">Categories</h4>
 

Скриншот проблемы ниже. При поиске отелей по запросу «Лондон» вам предоставляется список из нескольких элементов в разделе «Местоположение» и нескольких элементов в разделе «Свойства«. Я хотел бы щелкнуть первый элемент, который появится под заголовком «Свойства». Это всего лишь один пример, и он будет варьироваться в зависимости от того, какое место ищет пользователь, поэтому не всегда может быть известно количество возвращенных местоположений/свойств — возможно, никогда не будет возвращено никаких местоположений!

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

Спасибо

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

1. Приведите html — код с примерами совпадающих элементов. Если вы хотите найти по тексту — css это не поддерживает.

2. Можете ли вы поделиться URL-адресом?

3. ryanair.com/gb/en . Я добавил скриншот и описание точной проблемы к исходному вопросу, так как я не уверен, как добавить изображение в комментарий

Ответ №1:

Возможно, простое добавление оператора if немного поможет:

 search = input("Enter something to search for")
elem = browser.find_elements_by_xpath(f'//span[text()="{search}"]')
if len(elem) > 1:
     elem[0].click() # select the element you want to click from the list
 

Если элементы в списке будут содержать некоторые дополнительные атрибуты, вы можете отфильтровать их таким образом:

 search = input("Enter something to search for")
elem = browser.find_elements_by_xpath(f'//span[text()="{search}"]')
if len(elem) > 1:
     elem.find_element_by_css_selector('type_of_selector[class="some_class"]')
 

Не могли бы вы предоставить более подробную информацию об этих элементах, и мы подумаем о решении. С уважением!

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

1. Есть три элемента, которые все возвращают один и тот же текст, поэтому, к сожалению, оператор if в тексте не сможет их различить. Я добавил xpath, в которых находятся элементы, и пример того, как выглядит один из элементов, если это поможет? Один из способов, которым я могу различить эти три элемента, состоит в том, что 2 из 3 находятся под тегом h4 с заголовком «группы» (показано в вопросе выше), в то время как другой 1 находится под тегом n h4 с заголовком «категории». Я не хочу выбирать первый элемент под заголовком «группы», однако он продолжает извлекать элемент в разделе «категории».

2. Да, это потому, что при вызове метода webdriver.find_element: будет возвращен первый элемент, соответствующий ограничениям. Как я писал ранее: вы должны использовать метод webdriver.find_elements, и вы получите все элементы, собранные в список. От вас зависит, какой элемент будет выбран.

3. Я добавил скриншот проблемы к первоначальному вопросу, это может помочь объяснить ее лучше, чем я до сих пор