Вопрос или проблема
Python Selenium – Невозможно нажать на следующую страницу
Я пытаюсь нажать на кнопку следующей страницы с помощью Selenium, но не могу. Следующая страница не загружается, и веб-страница показывает ошибку, но в адресной строке я вижу, что клик произошел, потому что URL изменяется.
Мой код для попытки нажать на следующую страницу выглядит так:
> WebDriverWait(driver, 10).until(
> EC.presence_of_element_located((By.CSS_SELECTOR, '[class="page_charts_section_charts_item object_song"]'))
> )
>
> next = True
>
> while next == True:
> songs = driver.find_elements(By.CSS_SELECTOR, '[class="page_charts_section_charts_item object_song"]')
> for song in songs:
> song_artist = song.find_elements(By.CSS_SELECTOR, '[class="ui_name_locale_original"]')
> genre = song.find_element(By.CSS_SELECTOR, '[class="genre comma_separated first"]')
> rating = song.find_element(By.CSS_SELECTOR, '[class="page_charts_section_charts_item_details_average_num"]')
> song_list.append(song_artist[0].text)
> artist_list.append(song_artist[1].text)
> genre_list.append(genre.text)
> rating_list.append(rating.text)
> try:
> WebDriverWait(driver, 30).until(
> EC.element_to_be_clickable((By.CSS_SELECTOR, '[class="ui_pagination_next_label"]'))
> )
> driver.find_element(By.CSS_SELECTOR, '[class="ui_pagination_next_label"]').click()
> except:
> next = False
А веб-страница следующая:
https://rateyourmusic.com/charts/top/song/all-time/a:system%2dof%2da%2ddown/
В обычном браузере я могу нажимать без каких-либо проблем, но, похоже, что браузер Selenium работает иначе.
Есть ли какие-либо предложения?
Большое спасибо заранее.
Ответ или решение
Добрый день!
Проблема, с которой вы столкнулись, может быть вызвана несколькими причинами, связанными с поведением Selenium на веб-страницах и динамической подгрузкой контента. Давайте разберем возможные решения вашей проблемы по шагам.
1. Убедитесь, что страница загружена
Иногда ссылка на следующую страницу может быть активна, но контент страницы еще не загружен. В вашем коде вы ожидаете наличие элемента для загрузки, но возможно стоит добавить дополнительные ожидания. Попробуйте использовать EC.visibility_of_element_located
вместо EC.presence_of_element_located
, чтобы убедиться, что элемент действительно видим.
2. Исправьте обработку нажатия кнопки "Далее"
Попробуйте немного изменить логику вашего цикла и добавить более надежные методы для обработки кликов. Например:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
next_page_available = True
while next_page_available:
# Обработка текущей страницы
songs = driver.find_elements(By.CSS_SELECTOR, '[class="page_charts_section_charts_item object_song"]')
for song in songs:
song_artist = song.find_elements(By.CSS_SELECTOR, '[class="ui_name_locale_original"]')
genre = song.find_element(By.CSS_SELECTOR, '[class="genre comma_separated first"]')
rating = song.find_element(By.CSS_SELECTOR, '[class="page_charts_section_charts_item_details_average_num"]')
song_list.append(song_artist[0].text)
artist_list.append(song_artist[1].text)
genre_list.append(genre.text)
rating_list.append(rating.text)
try:
# Ожидаем, пока кнопка "Далее" станет кликабельной
next_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '[class="ui_pagination_next_label"]'))
)
next_button.click()
# Возможно, стоит подождать загрузку следующей страницы
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, '[class="page_charts_section_charts_item object_song"]'))
)
except Exception as e:
print(f"Ошибка при попытке нажать кнопку 'Далее': {e}")
next_page_available = False
3. Проверьте наличие ошибок в консоли
Также полезно проверить консоль браузера на наличие ошибок JavaScript, которые могут препятствовать правильной загрузке страницы. Вы можете сделать это, используя инструменты разработчика (нажмите F12), и посмотрите на вкладке "Консоль".
4. Использование JavaScript для клика
Иногда стандартный клик может не срабатывать, особенно если на элементе есть обработчики событий. В таких случаях вправду может помочь JavaScript. Попробуйте заменить строку нажатия кнопки следующим кодом:
driver.execute_script("arguments[0].click();", next_button)
5. Проверьте, не остается ли элемент заблокированным
Иногда элементы могут быть временно заблокированы (напр., модальными окнами или рекламой). Убедитесь, что ничего не мешает клику, используя временные задержки или дополнительные проверки.
Заключение
Согласно вышеописанным действиям вы должны быть в состоянии корректно перейти на следующую страницу. Если после всех изменений проблема не решается, возможно, стоит рассмотреть использование альтернативных библиотек для парсинга, таких как Beautiful Soup в сочетании с requests, если динамика страницы позволяет сделать это без JavaScript.
Если у вас есть дальнейшие вопросы, не стесняйтесь задавать их. Удачи в ваших экспериментах с Selenium!