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...
  • Вопрос задан
  • 38 просмотров
Решения вопроса 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()
    ...

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

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

Войти через центр авторизации
Похожие вопросы
от 70 000 до 120 000 ₽
от 200 000 до 350 000 ₽
SpectrumData Екатеринбург
от 120 000 до 200 000 ₽
17 мая 2022, в 00:28
20000 руб./за проект
16 мая 2022, в 23:42
7000 руб./за проект
16 мая 2022, в 22:34
3000 руб./за проект