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

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

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

Войти через центр авторизации
Похожие вопросы