Проблема с элементом пагинации
Помогите порешать с элементом пагинации, выбивает ошибку мол один элемент перекрывает другой, никак не пойму что с этим делать.
Мой предыдущий вопрос не подходит, потому что страница точно прогружается(Там в сумме задержка 5 секунд), и парсит все отлично до того как выбьет ошибку.
try:
while True:
time.sleep(3)
...
Тут парсер
...
try:
a_next_page = driver.find_element_by_class_name('pagination')
a_next_page.click()
time.sleep(2)
except NoSuchElementException:
break
Вот весь код парсера: https://dpaste.org/qcCX
Вот ссылка сайта, в котором что-то не так: https://atl.ua/search?q=Gazer
Это то как работает программа до ошибки: https://dpaste.org/o2ev, при том первые стрницы 3-4 перелистывает нормально
Traceback:
Message: Element <div class="pagination"> is not clickable at point (833,617) because another element <div id="myoverlay" class="pp-visible"> obscures it
UPD:
Я понял что перекрывает элемент, при перелистывании страницы вылезает вот это вот:
Как можно было бы это обойти?
UPD 2.0:
Я понял что вылазит больше элементов чем 1 при парсинге этого сайта, попытался обойти с помощью try: except:, ничего не вышло, сейчас финальный вариант обхода выглядит вот так:
Error_1 = driver.find_element(By.XPATH,'//*[@id="close_bubble"]')
Error_2 = driver.find_element(By.XPATH,'//*[@id="pp-form"]/div')
Error_3 = driver.find_element(By.XPATH,'//*[@id="bingc-active-close-button"]')
try:
while True:
...
тут парсер
...
if Error_1.is_displayed():
driver.implicitly_wait(10.5)
driver.find_element(By.XPATH,'//*[@id="close_bubble"]').click()
elif Error_2.is_displayed():
driver.implicitly_wait(10.5)
driver.find_element(By.XPATH,'//*[@id="pp-form"]/div').click()
elif Error_3.is_displayed():
driver.implicitly_wait(10.5)
driver.find_element(By.XPATH,'//*[@id="bingc-active-close-button"]').click()
else:
continue
try:
a_next_page = driver.find_element_by_class_name('pagination')
a_next_page.click()
time.sleep(3.5)
except NoSuchElementException:
break
И этот способ работает но слишком коряво, поэтому все еще нужна помощь.
Ответы (1 шт):
Вообщем, я решил эту проблему, изначально выбивало ошибку по той причине что выскакивали всякие div блоки которые перекрывали элемент пагинации, главная задача была их очистить, как я это сделал:
Ввел переменные div-ов, которые нужно было убирать
driver.get(url)
Error_1 = driver.find_element(By.XPATH,'//*[@id="close_bubble"]')
Error_2 = driver.find_element(By.XPATH,'//*[@id="pp-form"]/div')
Error_3 = driver.find_element(By.XPATH,'//*[@id="bingc-active-close-button"]')
Ввел условие которое звучит так если Error_1/2/3 - видно, драйвер кликает по close button, выглядит оно вот так:
if Error_1.is_displayed():
time.sleep(15)
driver.find_element(By.XPATH,'//*[@id="close_bubble"]').click()
elif Error_2.is_displayed():
time.sleep(15)
driver.find_element(By.XPATH,'//*[@id="pp-form"]/div').click()
elif Error_3.is_displayed():
time.sleep(15)
driver.find_element(By.XPATH,'//*[@id="bingc-active-close-button"]').click()
Так же в конце этого условия я прописывал
else: continue
Это было супер неправильно, потому что как оказалось, continue не продолжает программу, он начинает следующий проход цикла, а значит в случае когда условия было под парсингом, скрипт не доходил до элемента пагинации, и на 4 странице я ловил постоянную прогрузку страниц, а когда условия было выше парсинга элементов, то скрипт просто завершался на 4 странице
Окончательный код парсера выглядит вот так:
driver.get(url)
Error_1 = driver.find_element(By.XPATH,'//*[@id="close_bubble"]')
Error_2 = driver.find_element(By.XPATH,'//*[@id="pp-form"]/div')
Error_3 = driver.find_element(By.XPATH,'//*[@id="bingc-active-close-button"]')
try:
while True:
time.sleep(2)
if Error_1.is_displayed():
time.sleep(15)
driver.find_element(By.XPATH,'//*[@id="close_bubble"]').click()
elif Error_2.is_displayed():
time.sleep(15)
driver.find_element(By.XPATH,'//*[@id="pp-form"]/div').click()
elif Error_3.is_displayed():
time.sleep(15)
driver.find_element(By.XPATH,'//*[@id="bingc-active-close-button"]').click()
for item_el in driver.find_elements_by_css_selector(".col-cell-3.middle, .col-inline-xs-3.middle"):
try:name = item_el.find_element_by_css_selector('.product-micro-title a').text
except NoSuchElementException:name = ''
# Не у всех товаров есть цена
try:
price = item_el.find_element_by_css_selector('.product-micro-price').text
except NoSuchElementException:
price = '-'
try: nal = item_el.find_element_by_css_selector('.product-status').text
except: nal = 'Нет в наличии'
row = f'{DT.datetime.now():%H:%M_%d-%m-%Y}',name, price, nal
print(row)
items.append(row)
try:
a_next_page = driver.find_element_by_class_name('pagination')
a_next_page.click()
time.sleep(1)
except NoSuchElementException:
break
