RPA/Python

[selenium] 동적 페이지 스크롤

꼰대 2021. 5. 6. 14:23

예를 들면 쇼핑몰 같은 페이지는 처음부터 모든 문서를 로딩하지 않고 스크롤을 내리면 이후 문서가 로딩되는 동적 페이지이다.

페이지 스크롤 및 동적 페이지 스크롤 방법은 아래와 같다.

 

 

from selenium import webdriver

# from selenium.webdriver.common.keys import Keys

import time



driver = webdriver.Chrome()

driver.get('https://shopping.naver.com/')

 

# 검색창에 검색어 입력

elem = driver.find_element_by_xpath('//*[@id="autocompleteWrapper"]/input[1]')

elem.send_keys('선풍기')

# 검색창에서 enter 눌러 검색 실행

# elem.send_keys(Keys.ENTER)

 

# 대기

driver.implicitly_wait(10)

 

# 검색 버튼 클릭

elem = driver.find_element_by_xpath('//*[@id="autocompleteWrapper"]/a[2]')

elem.click()

 

# 대기

driver.implicitly_wait(10)

 

# 스크롤 다운

# 1. 지정한 위치로 스크롤 다운 (세로 1080만큼 다운)

driver.execute_script('window.scrollTo(0, 1080)')

 

# 2. 페이지 하단으로 스크롤 다운

# end키와 동일하게 작동하며 동적 스크롤 페이지에서는 스크롤 하단으로 내려도 다시 스크롤 생김

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



# 3. 따라서 현재 문서의 높이를 구해 높이가 0일때까지 2초 간격으로 스크롤 내림

 

# 현재 문서 높이 구하기

prev_height = driver.execute_script('return document.body.scrollHeight')

 

while True:

    # 스크롤 내리기

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

 

    # 페이지 로딩 대기

    # 페이지 로딩 대기가 적용이 안되는 곳이 있다. 이때는 sleep를 준다.

    # driver.implicitly_wait(10)

    time.sleep(3)

 

    # 현재 문서 높이 구하기

    current_height = driver.execute_script('return document.body.scrollHeight')

 

    # 이전 높이와 현재 높이의 변화가 없다면 페이지 맨 하단

    if prev_height == current_height:

        break

    

    # 현재 높이를 이전 높이로 저장

    prev_height = current_height

 

# 대기

driver.implicitly_wait(10)

 

# 스크롤 맨 위로 올리기

driver.execute_script('window.scrollTo(0, 0)')

 

 

===================================================================

 

특정 영역의 원하는 Element가 있는 곳까지 스크롤

 

from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains



driver = webdriver.Chrome()

driver.get('https://www.w3schools.com/html/')

driver.maximize_window()

driver.implicitly_wait(10)

 

# 목적지 Element

elem = driver.find_element_by_xpath('//*[@id="leftmenuinnerinner"]/a[61]')

 

# 목적지 Element까지 이동

# 방법1

actions = ActionChains(driver)

actions.move_to_element(elem).perform()

 

# 방법2

xy = elem.location_once_scrolled_into_view

 

elem.click()

반응형