Задать вопрос
latty337
@latty337
Python

Как тут имитировать клик каждого обьекта li в dropdown?

driver.get(item_href)

        e = driver.find_element_by_class_name("b-custom-drop-down")
        e.click() 

        time.sleep(1)

        html_list = driver.find_element(By.XPATH,"/html/body/div[7]/div/div/div[2]/div[1]/div[1]/div/div[2]/div[4]/div/table/tbody/tr[2]/td[1]/div/div/ul")

        items = html_list.find_elements_by_css_selector(".b-custom-drop-down__list-item")

        for item in items:

            time.sleep(5)
            item.click()
            name = driver.find_element(By.XPATH, '/html/body/div[7]/div/div/div[2]/div[1]/div[1]/div/div[2]/div[1]/h1/span')
            code = driver.find_element(By.XPATH, '/html/body/div[7]/div/div/div[2]/div[1]/div[1]/div/div[2]/div[2]/ul/li[2]/span')
            price = driver.find_element(By.XPATH, '/html/body/div[7]/div/div/div[2]/div[1]/div[1]/div/div[2]/div[3]/div/div/p/span[1]')
            amount = driver.find_element(By.XPATH, '/html/body/div[7]/div/div/div[2]/div[1]/div[1]/div/div[2]/div[2]/ul/li[1]')
            cur = driver.find_element(By.XPATH, '/html/body/div[7]/div/div/div[2]/div[1]/div[1]/div/div[2]/div[3]/div/div/p/span[2]')
            size = driver.find_element(By.XPATH, '/html/body/div[7]/div/div/div[2]/div[1]/div[1]/div/div[2]/div[4]/div/table/tbody/tr[2]/td[1]/div/div/span')
                    
            print(f"Наименование: {name.text} Код:{code.text} Наличие: {amount.text}  Стоимость: {price.text} {cur.text} Размер: {size.text}") 
            e = driver.find_element_by_class_name("b-custom-drop-down")
            e.click()


Имеется вот такой код для парсинга каждого li обьекта в dropdown меню, при запуске цикла первый раз парсит как надо а дальше выдает ошибку

"Message: stale element reference: element is not attached to the page document
(Session info: chrome=97.0.4692.71)
"

Подскажите пожалуйста https://decolux.in.ua/p982095659-tkanevyj-rolet-lu...
  • Вопрос задан
  • 43 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
@o5a
Проблема в том, что item принадлежит изначальному объекту driver (первоначальной загруженной странице). Но после выбора варианта товара (нажатия item.click() ) загружается новая страница с этим вариантом. В результате driver загружается уже другой страницей. А item все так же продолжает ссылаться на объект из первоначальной. Потому и возникает такая ошибка.

Я не эксперт в селениуме, может есть более правильный способ, но в данном случае навскидку вижу можно просто каждый раз заново искать элемент для клика, перебирая по индексам, вместо объектов item.
for idx in range(len(items)):
    time.sleep(1)
    # заново ищем элемент
    item = driver.find_element_by_xpath(f"//li[@class='b-custom-drop-down__list-item'][{idx+1}]")
    item.click()
    ...

В данном случае предполагается, что на каждой такой странице список вариантов одинаковый. Иначе конечно же получим ошибку при попытке выйти за пределы списка.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
31 янв. 2025, в 10:41
1000 руб./за проект
31 янв. 2025, в 10:36
10000 руб./за проект
31 янв. 2025, в 10:34
10000 руб./за проект