Как скролить в selenium python
Перейти к содержимому

Как скролить в selenium python

  • автор:

Как прокрутить страницу вниз на python?

Всем добрый день. Есть парсер, который парсит эту страницу:
https://www.flashscore.ru/
Он кликает на матчи и выводит их ссылку (сайт устроен так, что открывает второй гугл хром и в нем уже этот матч, запустите скрипт и поймёте о чем я говорю). Но после 17 матча (ЛАСК/ШТУРМ) выводит ошибку. Нужно прокручивать страницу вниз, чтобы дальше кликать на матчи. Подскажите, как прокрутить страницу на несколько матчей вниз или вообще до самого низу? Здесь с помощью js это делать? Заранее спасибо.
Код:

import time from selenium import webdriver from selenium.common.exceptions import TimeoutException from bs4 import BeautifulSoup count = 0 driver = webdriver.Chrome(executable_path="C:\\Users\\iljal\\PycharmProjects\\google_sheets\\chromedriver") # здесь указать путь к chromedriver он обычно в той же папке где и Ваш проект driver.get('https://www.flashscore.ru/') time.sleep(3) # C:\Users\iljal\PycharmProjects\google_sheets\chromedriver arr = driver.find_elements_by_css_selector( ".event__match.event__match--scheduled.event__match--oneLine" ) # optional (if you are not satisfied with the download speed) driver.set_page_load_timeout(0.5) for channel in arr: try: channel.click() count += 1 if count == 17: driver.execute_script( "var evt = document.createEvent('MouseEvents');evt.initEvent('wheel', true, true);evt.deltaY = -100000;document.querySelector('.yamb-conversation__content').dispatchEvent(evt);") # такая прокрутка не работает, выводит ошибку: except TimeoutException: print("data not received. need more time in driver.set_page_load_timeout") continue driver.switch_to.window(driver.window_handles[arr.index(channel)+1]) link = driver.current_url print(link) driver.switch_to.window(driver.window_handles[0])

После 17 матчей выводит ошибку при попытке прокрутить вниз:

raise exception_class(message, screen, stacktrace) selenium.common.exceptions.JavascriptException: Message: javascript error: Cannot read property 'dispatchEvent' of null (Session info: chrome=83.0.4103.97)
  • Вопрос задан более трёх лет назад
  • 5393 просмотра

2 комментария

Простой 2 комментария

Python3.x + Selenium как листать [закрыт]

Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.

Закрыт 3 года назад .

Мне нужно пролистать страницу и нажать на элемент.
Не могу понять, как листать страницу с помощью selenium.
Подскажите, пожалуйста!

Отслеживать
12.5k 7 7 золотых знаков 19 19 серебряных знаков 48 48 бронзовых знаков
задан 5 янв 2021 в 9:28
109 1 1 серебряный знак 9 9 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Если нужно прокрутить к целевому элементу, можно воспользоваться методом .move_to_element() из ActionChains, пример:

from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get('http://www.w3schools.com/') target = driver.find_element_by_link_text('BROWSE TEMPLATES') actions = ActionChains(driver) actions.move_to_element(target) actions.perform() 

Для прокрутки в конец (начало) страницы через .send_keys():

from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get('http://www.w3schools.com/') driver.find_element_by_tag_name('body').send_keys(Keys.END) # send_keys(Keys.HOME), если в начало # так тоже сработает: # send_keys(Keys.DOWN) send_keys(Keys.PAGE_DOWN) # send_keys(Keys.UP) send_keys(Keys.PAGE_UP) 

Для прокрутки на заданное количество пикселей метод окна .scrollBy():

scroll_vаlue = -200 scroll_by = f'window.scrollBy(0, );' driver.execute_script(scroll_by) 

Как можно осуществить скролл внутри всплывающего окна с помощью Selenium webdriver?

63f63f6c64b1a623608474.png

нужно осуществить скролл внутри окна ‘Подписчики’

driver.execute_script(«window.scrollTo(0, 2080)») — не сработало, а других способов не знаю. Помогите, пожалуйста.

  • Вопрос задан 22 февр. 2023
  • 316 просмотров

Комментировать

Решения вопроса 1

driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", element)

Вместо element — ваш элемент, можно найти как обычно, через XPATH и т.д.
Только оно прокрутит 1 раз, пока подписчики не начнут прогружаться. Вам нужно разделить нацело кол-во подписчиков на 12, тогда, вы получите кол-во прокручиваний.

Ответ написан 22 февр. 2023

Комментировать

Нравится Комментировать

Ответы на вопрос 1

from selenium import webdriver driver = webdriver.Chrome() # открыть всплывающее окно driver.execute_script("window.open('https://www.example.com', 'myPopup', 'width=400,height=400');") # переключиться на всплывающее окно driver.switch_to.window("myPopup") # проскроллить всплывающее окно на 100 пикселей вниз driver.execute_script("window.scrollBy(0, 100);")

Ответ написан 22 февр. 2023

andrey13879 @andrey13879 Автор вопроса

63f7518a972c1104359148.png

все равно не переключается на всплывающее окно, бот открывает окно поменьше и мотает вниз то, что выделено красным

Ваш ответ на вопрос

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

python

  • Python
  • +3 ещё

В боте когда я меняю переменую many += 1 выводиться ошибка?

  • 1 подписчик
  • 14 минут назад
  • 9 просмотров

Как я могу прокрутить веб-страницу с помощью selenium webdriver в Python?

В настоящее время я использую selenium webdriver для разбора страницы друзей пользователей Facebook и извлечения всех идентификаторов из AJAX-скрипта. Но мне нужно прокрутить вниз, чтобы получить всех друзей. Как мне прокрутить вниз в Selenium. Я использую python. python selenium selenium-webdriver automated-tests

Поделиться Источник 08 января 2014 в 03:44

27 ответов

Вы можете использовать

driver.execute_script("window.scrollTo(0, Y)") 

где Y — высота (на мониторе с полным настроем — 1080). (Благодаря @lukeis) Вы также можете использовать

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 

для прокрутки до нижней части страницы. Если вы хотите прокручивать до страницы с бесконечной загрузкой, например, в социальных сетях, в Facebook и т.д. (благодаря @Cuong Tran)

SCROLL_PAUSE_TIME = 0.5 # Get scroll height last_height = driver.execute_script("return document.body.scrollHeight") while True: # Scroll down to bottom driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Wait to load page time.sleep(SCROLL_PAUSE_TIME) # Calculate new scroll height and compare with last scroll height new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height 

другой метод (благодаря Juanse) — выбрать объект и

label.sendKeys(Keys.PAGE_DOWN); 

Поделиться 03 января 2015 в 22:13

Если вы хотите прокрутить вниз до низа бесконечной страницы (например, linkedin.com), вы можете использовать этот код:

SCROLL_PAUSE_TIME = 0.5 # Get scroll height last_height = driver.execute_script("return document.body.scrollHeight") while True: # Scroll down to bottom driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Wait to load page time.sleep(SCROLL_PAUSE_TIME) # Calculate new scroll height and compare with last scroll height new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height 

Поделиться 08 апреля 2017 в 19:32

Вы можете использовать send_keys для имитации нажатия клавиши END (или PAGE_DOWN ) (которая обычно прокручивает страницу):

from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By html = driver.find_element(By.TAG_NAME, 'html') html.send_keys(Keys.END) 

Поделиться 15 июля 2018 в 05:34
Тот же метод, как показано здесь: в Python вы можете просто использовать

driver.execute_script("window.scrollTo(0, Y)") 

(Y — это вертикальная позиция, к которой вы хотите прокрутиться)
Поделиться 08 января 2014 в 04:04

element=find_element_by_xpath("xpath of the li you are trying to access") element.location_once_scrolled_into_view 

это помогло, когда я пытался получить доступ к ‘li’, который не был виден.
Поделиться 07 июня 2016 в 22:54

Для моей цели я хотел прокручивать вниз больше, не забывая о положении окна. Мое решение было похожим и использовало window.scrollY

driver.execute_script("window.scrollTo(0, window.scrollY + 200)") 

который перейдет к текущей позиции прокрутки y + 200
Поделиться 02 августа 2018 в 16:59
Вот как вы прокручиваете веб-страницу вниз:

driver.execute_script("window.scrollTo(0, 1000);") 

Поделиться 28 ноября 2018 в 07:14

Самый простой способ, который я нашел, чтобы решить эту проблему, был выбрать метку и затем отправить:

label.sendKeys(Keys.PAGE_DOWN); 

Надеюсь, это сработает!
Поделиться 16 апреля 2018 в 18:21
прокрутка загрузки страниц. Пример: среда, квора, и т.д.

last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight-1000);") # Wait to load the page. driver.implicitly_wait(30) # seconds new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # sleep for 30s driver.implicitly_wait(30) # seconds driver.quit() 

Поделиться 22 апреля 2019 в 12:54

Ни один из этих ответов не сработал для меня, по крайней мере, не для прокрутки страницы результатов поиска в Facebook, но после многих тестирований я нашел это решение:

while driver.find_element_by_tag_name('div'): driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") Divs=driver.find_element_by_tag_name('div').text if 'End of Results' in Divs: print 'end' break else: continue 

Поделиться 09 ноября 2017 в 12:37

При работе с YouTube плавающие элементы дают значение «0» в качестве высоты прокрутки, поэтому вместо использования «return document.body.scrollHeight» попробуйте использовать этот «return document.documentElement.scrollHeight» настроить время паузы прокрутки в соответствии с вашей скоростью интернета, иначе он будет выполняться только один раз, а затем ломается после этого.

SCROLL_PAUSE_TIME = 1 # Get scroll height """last_height = driver.execute_script("return document.body.scrollHeight") this dowsnt work due to floating web elements on youtube """ last_height = driver.execute_script("return document.documentElement.scrollHeight") while True: # Scroll down to bottom driver.execute_script("window.scrollTo(0,document.documentElement.scrollHeight);") # Wait to load page time.sleep(SCROLL_PAUSE_TIME) # Calculate new scroll height and compare with last scroll height new_height = driver.execute_script("return document.documentElement.scrollHeight") if new_height == last_height: print("break") break last_height = new_height 

Поделиться 13 марта 2019 в 04:35

Вот пример фрагмента кода Selenium, который вы можете использовать для этого типа целей. Он переходит по URL для результатов поиска на YouTube в ‘Enumerate python tutorial’ и прокручивает вниз, пока не найдет видео с названием: ‘Enumerate python tutorial(2020).’

driver.get('https://www.youtube.com/results?search_query=enumerate+python') target = driver.find_element_by_link_text('Enumerate python tutorial(2020).') target.location_once_scrolled_into_view 

Поделиться 07 августа 2020 в 11:56

Этот код прокручивается до самого низа, но не требует, чтобы вы ждали каждый раз. Он будет постоянно прокручиваться, а затем останавливаться внизу (или таймаут)

from selenium import webdriver import time driver = webdriver.Chrome(executable_path='chromedriver.exe') driver.get('https://example.com') pre_scroll_height = driver.execute_script('return document.body.scrollHeight;') run_time, max_run_time = 0, 1 while True: iteration_start = time.time() # Scroll webpage, the 100 allows for a more 'aggressive' scroll driver.execute_script('window.scrollTo(0, 100*document.body.scrollHeight);') post_scroll_height = driver.execute_script('return document.body.scrollHeight;') scrolled = post_scroll_height != pre_scroll_height timed_out = run_time >= max_run_time if scrolled: run_time = 0 pre_scroll_height = post_scroll_height elif not scrolled and not timed_out: run_time += time.time() - iteration_start elif not scrolled and timed_out: break # closing the driver is optional driver.close() 

Это намного быстрее, чем ждать 0,5-3 секунды каждый раз для ответа, когда этот ответ может занять 0,1 секунды

Поделиться 11 июля 2019 в 01:20

Я искал способ прокрутки динамической веб-страницы и автоматической остановки после достижения конца страницы и нашел эту нить. Пост от @Cuong Tran с одним из основных модификаций был ответом, который я искал. Я подумал, что другие могут найти модификацию полезной (она оказывает явный эффект на работу кода), поэтому этот пост. Модификация заключается в том, чтобы переместить оператор, который захватывает последнюю высоту страницы внутри цикла (чтобы каждая проверка сравнивалась с предыдущей высотой страницы). Итак, код ниже:

Постоянно прокручивается динамическая веб-страница ( .scrollTo() ), останавливаясь только тогда, когда высота страницы остается прежней для одной итерации.

(Есть еще одна модификация, где оператор break находится внутри другого условия (в случае, если страница ‘прижимается’) который можно удалить).

 SCROLL_PAUSE_TIME = 0.5 while True: # Get scroll height ### This is the difference. Moving this *inside* the loop ### means that it checks if scrollTo is still scrolling last_height = driver.execute_script("return document.body.scrollHeight") # Scroll down to bottom driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Wait to load page time.sleep(SCROLL_PAUSE_TIME) # Calculate new scroll height and compare with last scroll height new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: # try again (can be removed) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Wait to load page time.sleep(SCROLL_PAUSE_TIME) # Calculate new scroll height and compare with last scroll height new_height = driver.execute_script("return document.body.scrollHeight") # check if the page height has remained the same if new_height == last_height: # if so, you are done break # if not, move on to the next loop else: last_height = new_height continue 

Поделиться 03 сентября 2018 в 18:21

Вы можете использовать send_keys для имитации нажатия клавиши PAGE_DOWN (которая обычно прокручивает страницу):

from selenium.webdriver.common.keys import Keys html = driver.find_element_by_tag_name('html') html.send_keys(Keys.PAGE_DOWN) 

Поделиться 08 сентября 2020 в 14:19
Функция ScrollTo() больше не работает. Вот что я использовал и все работало нормально.

driver.execute_script("document.getElementById('mydiv').scrollIntoView();") 

Поделиться 18 марта 2020 в 10:09
Согласно документации, класс ActionChains выполняет работу:

from selenium import webdriver from selenium.webdriver import ActionChains driver = webdriver.Firefox() action_chains = ActionChains(driver) action_chains.scroll(x: int, y: int, delta_x: int, delta_y: int, duration: int = 0, origin: str = 'viewport').perform() 

Поделиться 14 мая 2022 в 13:21

Если вы хотите прокручивать в пределах определенного представления/кадра (WebElement), вам нужно только заменить «body» на определенный элемент, в котором вы намерены прокручивать. Я получаю этот элемент через «getElementById» в примере ниже:

self.driver.execute_script('window.scrollTo(0, document.getElementById("page-manager").scrollHeight);') 

это происходит на YouTube, например.
Поделиться 13 января 2020 в 10:01
вставьте эту строку driver.execute_script(«window.scrollBy(0,925)», «»)
Поделиться 15 января 2021 в 06:14
Прокрутка до элемента: Найдите элемент и прокрутите с помощью этого кода.

scroll_element = driver.find_element(By.XPATH, "your element xpath") driver.execute_script("arguments[0].scrollIntoView();", scroll_element) 

Поделиться 03 февраля 2023 в 04:03
Цикл с использованием метода «отправки ключей» прокрутки страницы:

pre_scroll_height = driver.execute_script('return document.body.scrollHeight;') while True: driver.find_element_by_tag_name('body').send_keys(Keys.END) time.sleep(5) post_scroll_height = driver.execute_script('return document.body.scrollHeight;') print(pre_scroll_height, post_scroll_height) if pre_scroll_height == post_scroll_height: break pre_scroll_height=post_scroll_height 

Поделиться 16 марта 2022 в 05:35

Вот метод, который я написал для медленного прокручивания до элемента целей Вы можете передать ему Y-ю позицию элемента CSS Selector Он прокручивается точно так же, как мы делаем с помощью мыши-колеса После вызова этого метода вы снова вызываете его с тем же объектом драйвера, но с новым целевым элементом, он затем прокручивается вверх/вниз, где бы этот элемент не существовал

def slow_scroll_to_element(self, driver, element_selector=None, target_yth_location=None): current_scroll_position = int(driver.execute_script("return window.scrollY")) if element_selector: target_yth_location = int(driver.execute_script("return document.querySelector('<>').getBoundingClientRect()['top'] + window.scrollY".format(element_selector))) scrollSpeed = 100 if target_yth_location-current_scroll_position > 0 else -100 def chunks(a, n): k, m = divmod(len(a), n) return (a[i*k+min(i, m):(i+1)*k+min(i+1, m)] for i in range(n)) for l in list(chunks(list(range(current_scroll_position, target_yth_location, scrollSpeed)) + list([target_yth_location+(-scrollSpeed if scrollSpeed > 0 else scrollSpeed)]), 3)): for pos in l: driver.execute_script("window.scrollTo(0, "+str(pos)+");") time.sleep(0.1) time.sleep(random.randint(1,3)) 

Поделиться 26 июня 2022 в 13:17

driver.execute_script("document.getElementById('your ID Element').scrollIntoView();") 

это работает для моего случая.
Поделиться 11 июня 2020 в 13:44

  • Продолжайте прокручивать пошагово. В противном случае, если вы всегда перескакиваете вниз, некоторые элементы загружаются только в виде контейнеров/дивов, но их содержимое не загружается, потому что они никогда не были видны (потому что вы перескакивали прямо вниз);
  • Разрешите достаточно времени для загрузки содержимого;
  • Это не бесконечная прокрутка страницы, есть конец, и вам нужно определить, когда конец достигнут;

Вот простая реализация:

from time import sleep def keep_scrolling_to_the_bottom(): while True: previous_scrollY = my_web_driver.execute_script( 'return window.scrollY' ) my_web_driver.execute_script( 'window.scrollBy( 0, 230 )' ) sleep( 0.4 ) if previous_scrollY == my_web_driver.execute_script( 'return window.scrollY' ): print( 'job done, reached the bottom!' ) break 

Протестировано и работает на Windows 7 x64, Python 3.8.0, selenium 4.1.3, Google Chrome 107.0.5304.107, сайт для аренды собственности.

Поделиться 20 ноября 2022 в 12:51

Вы бы рассмотрели использование расширения Selenium, чтобы не приходилось кодировать все самостоятельно? Я автор пакета Browserist в полном раскрытии. Browserist является легким, менее подробным расширением веб-драйвера Selenium, что еще проще в автоматизации браузера. Просто установите пакет с помощью pip install browserist .

Browserist имеет несколько вариантов прокрутки. Независимо от того, прокручивается ли он до определенных элементов, на несколько пикселей вниз или вверх, на всю страницу вниз или вверх, в конце или вверху страницы, нужно всего несколько строк кода. Примеры:

from browserist import Browser browser = Browser() browser.open.url("https://stackoverflow.com") browser.scroll.into_view("/html/body/div[3]/div[2]/div[1]/div[3]/div/div/div[6]") browser.scroll.page.to_end() browser.scroll.page.to_top() browser.scroll.page.down() browser.scroll.down_by(100) browser.scroll.up_by(50) 

Вот что я получаю (замедливается, так как Browserist быстро заканчивает работу). Надеюсь, это поможет. Дайте мне знать, есть ли у вас вопросы?

Поделиться 11 мая 2023 в 17:59

Прокрутите до определенного элемента, позиции или конца страницы:

from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # Find the target element you want to scroll to element = driver.find_element_by_id("target-element-id") # Scroll to the target element driver.execute_script("arguments[0].scrollIntoView();", element) # Scroll to a specific position (x, y coordinates) driver.execute_script("window.scrollTo(0, 500)") # Scroll to the end of the page driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") 

Поделиться 30 мая 2023 в 16:08

Существуют способы для этого, но все они имеют ограничение, если вы используете их для бесконечной загрузки сайта.

Ограничение заключается в времени ожидания, пока не произойдет новый скролл, и это очень плохо, так как мы не можем быть уверены в скорости интернета других. Любой способ, если я найду решение для этого, я обновит этот пост.

loading_waiting_time = 1 # Get actual page height previous_page_height = driver.execute_script("return document.body.scrollHeight") # Run infinte loop and stop it if new_page_height is equal to previous_page_height while True: # Scroll to the end of page driver.execute_script('window.scrollTo(0, document.body.scrollHeight);') # Waiting until new images loaded time.sleep(loading_waiting_time) # Get new page height new_page_height = driver.execute_script("return document.body.scrollHeight") if new_page_height == previous_page_height: break previous_page_height = new_page_height 

2-е решение Это решение хорошо для нефиксированного футера.

loading_waiting_time = 1 # Get actual page height previous_page_height = driver.execute_script("return document.body.scrollHeight") # Run infinte loop and stop it if new_page_height is equal to previous_page_height while True: # Scroll to `footer` using JS footer_element = driver.find_element(By.TAG_NAME, 'footer') driver.execute_script('arguments[0].scrollIntoView(true)', footer_element) # Waiting until new images loaded time.sleep(loading_waiting_time) # Get new page height new_page_height = driver.execute_script("return document.body.scrollHeight") if new_page_height == previous_page_height: break previous_page_height = new_page_height 

3-е решение Это решение хорошо для нефиксированного футера.

loading_waiting_time = 1 # Get actual page height previous_page_height = driver.execute_script("return document.body.scrollHeight") # Run infinte loop and stop it if new_page_height is equal to previous_page_height while True: # Scroll to until `footer` is visible WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.TAG_NAME, 'footer'))) # Waiting until new images loaded time.sleep(loading_waiting_time) # Get new page height new_page_height = driver.execute_script("return document.body.scrollHeight") if new_page_height == previous_page_height: break previous_page_height = new_page_height 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *