파이썬 셀레니움 스크롤 내리기 - python selenium scroll down
selenium을 사용하다 보면 스크롤을 내려야 하는 상황이 발생합니다.
오늘은 selenium에서 스크롤을 내리는 방법들에 대해 알아보겠습니다.
1. driver.execute_script("window.scrollTo(x, y)")
첫 번째는 javascript를 이용한 스크롤 내리기입니다.
브라우저를 열고 빌보드 200 차트로 들어가 보겠습니다.
driver.get("https://www.billboard.com/charts/billboard-200")
화면 최상단으로부터 700픽셀을 내려보도록 하겠습니다.
driver.execute_script("window.scrollTo(0, 700)")
스크롤이 내려온 것을 확인할 수 있습니다.
참고로 execute_script() 함수는 브라우저에서 javascript가 실행되도록 해주는 함수입니다.
예를 들어 driver로 실행된 브라우저의 탭이 여러 개가 있을 경우
driver.execute_script("alert('이 브라우저에서 포커스가 맞춰져있습니다.')")
위와 같은 명령어를 실행하여 driver가 어느 탭에 포커스가 맞춰져있는지 알 수 있습니다.
2. move_to_element()
두 번째는 selenium의 ActionChains을 이용한 스크롤 내리기입니다.
사실 MoveToElement() 같은 경우 스크롤을 내린다기 보다 목표한 element로 포커스를 이동하는 것이라고 보는 게 더 좋을 듯 합니다.
빌보드 200 차트에서 50위로 이동해 보겠습니다.
#ActionChains모듈 가져오기
from selenium.webdriver import ActionChains
#ActionChains생성
action = ActionChains(driver)
#리스트 가져오기
musicList = driver.find_elements_by_css_selector("div.chart-list.container > ol.chart-list__elements > li.chart-list__element")
#move_to_element를 이용하여 이동
action.move_to_element(musicList[49]).perform()
move_to_element()를 이용하여 원하는 element로 이동합니다.
3. Keys.PAGE_DOWN
마지막은 Keys를 이용한 스크롤 내리기입니다.
흔히 우리가 사용하는 PageDown키를 누르는 것과 같은 효과를 줍니다.
Keys 모듈을 가져옵니다.
from selenium.webdriver.common.keys import Keys
body에 Keys.PAGE_DOWN을 입력합니다.
driver.find_element_by_tag_name('body').send_keys(Keys.PAGE_DOWN)
스크롤이 내려간 것을 확인할 수 있습니다.
위에 설명해드린 방법들과 for문을 이용하여
for c in range(0,5):
driver.find_element_by_tag_name('body').send_keys(Keys.PAGE_DOWN)
time.sleep(1)
반복적으로 스크롤을 내릴수 도 있으니 취향에 맞게 사용하시면 되겠습니다.
풀 코드입니다.
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome('chromedriver.exe')
driver.get("https://www.billboard.com/charts/billboard-200")
time.sleep(2)
#javascript사용
driver.execute_script("window.scrollTo(0, 700)")
#move_to_element사용
musicList = driver.find_elements_by_css_selector("div.chart-list.container > ol.chart-list__elements > li.chart-list__element")
time.sleep(1)
action = ActionChains(driver)
action.move_to_element(musicList[49]).perform()
#Keys.PAGE_DOWN 사용
driver.find_element_by_tag_name('body').send_keys(Keys.PAGE_DOWN)
#for문 응용
for c in range(0,5):
driver.find_element_by_tag_name('body').send_keys(Keys.PAGE_DOWN)
time.sleep(1)