Перейти к содержимому

Фотография

Selenium: поиск именно в определенном div блоке

selenium python

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 10

#1 croXer

croXer

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Капранов Илья Сергеевич

Отправлено 19 августа 2025 - 11:52

Есть div блок. Хотелось бы, чтобы код автоматически в этом блоке находил по тексту строку и выбирал её. Но не получается: он все ровно не в div-блоке ищет. Старался сделать таким методом.

 

Otbor_podrazd1 = "Поликлиника взрослая"

test1 = driver.find_element(By.ID, "ext-gen3208") # Тут блок div находит

test1 = driver.find_element(By.XPATH, f"//div[contains(text(), '{Otbor_podrazd1}')]").click() #Тут я ищу внутри блока div, по тексту строку

 

В итоге, с переменной Otbor_podrazd1 код находит, но не в блоке div, а вообще


  • 0

#2 croXer

croXer

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Капранов Илья Сергеевич

Отправлено 19 августа 2025 - 11:53

Прикрепленный файл  AJf52YY8.png   430,37К   0 Количество загрузок:


  • 0

#3 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 879 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 19 августа 2025 - 12:05

Чтобы найти элемент внутри другого элемента, нужно метод find_element вызывать не в driver, а в ранее найденном элементе.

 

Кроме того, по правилам XPath, запросы относительно другого элемента должны начинаться с точки. Если запрос начинается со слеша, поиск выполняется от начала страницы, а не внутри элемента.

 

Ну и ещё метод click ничего не возвращает, поэтому результат его работы присваивать куда-либо нет необходимости.

test1.find_element(By.XPATH, f".//div[contains(text(), '{Otbor_podrazd1}')]").click() #Тут я ищу внутри блока div, по тексту строку

  • 1
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#4 croXer

croXer

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Капранов Илья Сергеевич

Отправлено 19 августа 2025 - 12:14

 

Чтобы найти элемент внутри другого элемента, нужно метод find_element вызывать не в driver, а в ранее найденном элементе.

 

Кроме того, по правилам XPath, запросы относительно другого элемента должны начинаться с точки. Если запрос начинается со слеша, поиск выполняется от начала страницы, а не внутри элемента.

 

Ну и ещё метод click ничего не возвращает, поэтому результат его работы присваивать куда-либо нет необходимости.

test1.find_element(By.XPATH, f".//div[contains(text(), '{Otbor_podrazd1}')]").click() #Тут я ищу внутри блока div, по тексту строку

Прикрепленный файл  Скриншот 19-08-2025 151306.jpg   71,42К   0 Количество загрузок:

 

Тогда он выходит в ошибку, что нету такого атрибута


  • 0

#5 croXer

croXer

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Капранов Илья Сергеевич

Отправлено 19 августа 2025 - 12:15

Может ли это быть если не хватает библиотеки какой-то? Я только начинающий просто

 

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

  • 0

#6 croXer

croXer

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Капранов Илья Сергеевич

Отправлено 19 августа 2025 - 12:17

А все, нашел ошибку. Сейчас проверю 


  • 0

#7 croXer

croXer

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Капранов Илья Сергеевич

Отправлено 19 августа 2025 - 12:22

 

Чтобы найти элемент внутри другого элемента, нужно метод find_element вызывать не в driver, а в ранее найденном элементе.

 

Кроме того, по правилам XPath, запросы относительно другого элемента должны начинаться с точки. Если запрос начинается со слеша, поиск выполняется от начала страницы, а не внутри элемента.

 

Ну и ещё метод click ничего не возвращает, поэтому результат его работы присваивать куда-либо нет необходимости.

test1.find_element(By.XPATH, f".//div[contains(text(), '{Otbor_podrazd1}')]").click() #Тут я ищу внутри блока div, по тексту строку

 

В итоге поправил, но теперь он не находит по части текста. 

На самом первом скриншоте видно, что "3 Поликлиника взрослая". 

 

 

selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Unable to locate an element with the xpath expression .//*[text(), 'Поликлиника взрослая')] because of the following error:
SyntaxError: Failed to execute 'evaluate' on 'Document': The string './/*[text(), 'Поликлиника взрослая')]' is not a valid XPath expression.
  (Session info: chrome=109.0.5414.168); For documentation on this error, please visit: https://www.selenium...lectorexception
Stacktrace:
Backtrace:

 

Otbor_podrazd1 = Поликлиника взрослая

 

        test1 = driver.find_element(By.CLASS_NAME, "x-combo-list-item")
        test1.find_element(By.XPATH, f".//*[text(), '{Otbor_podrazd1}')]").click()

 

Теперь он просто не находит Поликлиника взрослая. Из за чего это может быть?


  • 0

#8 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 879 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 19 августа 2025 - 12:49

Скобки в локаторе не сбалансированы, локатор невалидный.


  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#9 croXer

croXer

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Капранов Илья Сергеевич

Отправлено 20 августа 2025 - 05:29

Скобки в локаторе не сбалансированы, локатор невалидный.

Доброе утро. Поправил. И все ровно он не находит его :(

 

        test1 = driver.find_element(By.ID, "ext-gen2618")
        test1.find_element(By.XPATH, f".//*[text()='{Otbor_podrazd1}']").click() #Тут я ищу внутри блока div, по тексту строку

 

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":".//*[text()='Поликлиническое отделение (Инсар)']"}
  (Session info: chrome=109.0.5414.168); For documentation on this error, please visit: https://www.selenium...lementexception
 
Прикрепленный файл  121221212121.jpg   191,73К   0 Количество загрузок:

  • 0

#10 croXer

croXer

    Новый участник

  • Members
  • Pip
  • 8 сообщений
  • ФИО:Капранов Илья Сергеевич

Отправлено 20 августа 2025 - 08:22

Скобки в локаторе не сбалансированы, локатор невалидный.

Изменил немного логику. Решил через find_elements. Застопарился на обработке результата, он не тыкает по нужному, д и вообще не тыкает, но он выводит список)
 

        test = driver.find_elements("css selector", "[class^='x-combo-list-item']")
        for spisokfindelement in test:
            if spisokfindelement == Otbor_podrazd1:
                spisokfindelement.click(Otbor_podrazd1)
            print(spisokfindelement.text)
    else:
        print("Элементы с классом 'element_class' не найдены")

  • 0

#11 DashDash

DashDash

    Новый участник

  • Members
  • Pip
  • 3 сообщений
  • ФИО:Дарья Инякина

Отправлено 20 августа 2025 - 08:40

Здравствуйте. Удобнее искать внутри parent element.

В вашем случае это будет выглядеть примерно так:

 

IWebElement combo = driver.findElement(By.ClassName("x-combo-list-inner"));

List<IWebElement> comboList = combo.FindElements(By.ClassName("x-combo-list-item"));

 

foreach(IWebElement item in comboList.Items)

{

   if(item.Text == 'Поликлиническое отделение (Инсар)')

    {  

          item.Click();

     }

};

 

вообще хорошо было бы выстроить infrastructure, а не искать поодному elements с помощью драйвера.


  • 0



Темы с аналогичным тегами selenium, python

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных