Selenium Intro
๋ธ๋ผ์ฐ์ ๋ฅผ ์ปจํธ๋กค์ ๊ฐ๋ฅํ๊ฒ ํด์ค
Python ๊ฐ์ ๊ฒฝ์ฐ, 3.5 ์ด์๋ถํฐ ์ง์๋๋ฉฐ 3.6 ์ด์ ๋ฒ์ ๋ถํฐ pip ๋ก ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉํ ์ ์์
์ฌ์ฉ ๊ฐ๋ฅํ ๋ธ๋ผ์ฐ์ ๋ ํ๋จ์ ๋ฆฌ์คํธ์
์ค์น ์ฝ๋
pip install selenium
Driver ๋ค์ด๋ก๋ ๋งํฌ , ํฌ๋กฌ,์ฃ์ง,ํ์ด์ดํญ์ค, ์ฌํ๋ฆฌ
๋ธ๋ผ์ฐ์ ์ด๊ธฐ (chrome)
from selenium import webdriver
driver = webdriver.Chrome('chromedriver.exe')
๊ถ์ฅ ๋ธ๋ผ์ฐ์ ์ด๊ธฐ ์ฝ๋
๋ธ๋ผ์ฐ์ ธ ์ด๊ธฐ ์ต์ ๋ฃ๊ธฐ
ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด ๋ ๋ฃ์ ์ ์๋ ์ต์ ์ ์ ๋ ๋์์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์๋์ฐ ์ฌ์ด์ฆ
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('window-size=1920,1080')
driver = webdriver.Chrome('chromedriver.exe', options=options)
Headless ( ์ฐฝ์ ํค์ง ์๊ณ ์คํํ๋ ๊ฒ, ์ ํ๋ธ ๊ฐ์ ๊ณณ์์ ์ข์)
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome('chromedriver.exe', options=options)
์ฐฝ ์ต๋ํ maxmize
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('start-maximized)
driver = webdriver.Chrome('chromedriver.exe', options=options)
# ์ด ๋ฐฉ๋ฒ ์ด์ธ์๋ ๋ค์ ๋ฐฉ๋ฒ
driver.maximize_window()
๋ธ๋ผ์ฐ์ ๋ซ๊ธฐ Close
driver.close() #ํ์ฌ ํญ ๋ซ๊ธฐ
driver.quit() #๋ธ๋ผ์ฐ์ ๋ซ๊ธฐ
๋ค๋ก๊ฐ๊ธฐ Back / ์์ผ๋ก๊ฐ๊ธฐ Front
driver.back() #๋ค๋ก๊ฐ๊ธฐ
driver.forward() #์์ผ๋ก๊ฐ๊ธฐ
ํญ ์ด๋ Tab Move
driver.window_handles[0] #๋ธ๋ผ์ฐ์ ํญ ๊ฐ์ฒด๋ฅผ ๋ฆฌ์คํธ๋ก ๋ฐํ. [0] ์ ์ธ๋ฑ์ฑ. ์ฒซ๋ฒ์ฌ ํญ์ ์๋ฏธ
driver.switch_to.window(driver.window_handles[0]) #์ฒซ๋ฒ์งธ ํญ์ผ๋ก ์ด๋
driver.switch_to.window(driver.window_handles[1]) #๋๋ฒ์งธ ํญ์ผ๋ก ์ด๋
driver.switch_to.window(driver.window_handles[2]) #์ธ๋ฒ์งธ ํญ์ผ๋ก ์ด๋
ํญ ๋ซ๊ธฐ Tab close
driver.switch_to.window(driver.window_handles[0]) #๋ซ์ ํญ์ผ๋ก ์ด๋ ํ
driver.close()
์๋ ๋จผํธ์ ๊ดํ์ฌ
์ฐ๋ฆฌ๋ ์น๋ธ๋ผ์ฐ์ ์์ ๋ก๊ทธ์ธ๋ ํ๊ณ ๋ฒํผ๋ ํด๋ฆญํ๊ณ ๊ฒ์์ฐฝ์ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ธฐ๋ ํ๋ค. ์ด๋ ๊ฒ ๋ธ๋ผ์ฐ์ ์์์ ๋ณด์ด๋ ๋ฒํผ, ๊ฒ์์ฐฝ, ์ฌ์ง, ํ ์ด๋ธ, ๋์์ ๋ฑ๋ฑ ์ด ๋ชจ๋ ๊ฒ๋ค์ ์๋ ๋จผํธ(element, ์์) ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ ๋ ๋์์ ์ฐ๋ฆฌ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ํน์ ์์๋ฅผ ํด๋ฆญํ๊ณ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ณ ์ฌ์ง๋ฑ์ ๋ฐ์์ค๊ณ ํ ์คํธ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฑ๋ฑ ์ด๋ ํ ์์น์ ์๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ถ๋ฅผ ๋ ์๋ ๋จผํธ๋ผ๋ ๊ฐ๋ ์ผ๋ก ์ ๊ทผํ๋ค. ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์๋ ๋จผํธ๋ก ์ ๊ทผํ ์ ์๋๋ฐ ๋๋ถ๋ถ xpath ๋ฅผ ์ฌ์ฉํ๋ค.
์๋ ๋จผํธ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ
driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]') #xpath ๋ก ์ ๊ทผ
driver.find_element_by_class_name('ico_search_submit') #class ์์ฑ์ผ๋ก ์ ๊ทผ
driver.find_element_by_id('ke_kbd_btn') #id ์์ฑ์ผ๋ก ์ ๊ทผ
driver.find_element_by_link_text('ํ์๊ฐ์
') #๋งํฌ๊ฐ ๋ฌ๋ ค ์๋ ํ
์คํธ๋ก ์ ๊ทผ
driver.find_element_by_css_selector('#account > div > a') #css ์
๋ ํฐ๋ก ์ ๊ทผ
driver.find_element_by_name('join') #name ์์ฑ์ผ๋ก ์ ๊ทผ
driver.find_element_by_partial_link_text('๊ฐ์
') #๋งํฌ๊ฐ ๋ฌ๋ ค ์๋ ์๋ ๋จผํธ์ ํ
์คํธ ์ผ๋ถ๋ง ์ ์ด์ ํด๋น ์๋ ๋จผํธ์ ์ ๊ทผ
driver.find_element_by_tag_name('input') #ํ๊ทธ ์ด๋ฆ์ผ๋ก ์ ๊ทผ
driver.find_element_by_tag_name('input').find_element_by_tag_name('a') #input ํ๊ทธ ํ์ํ๊ทธ์ธ a ํ๊ทธ์ ์ ๊ทผ
driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/div/div[3]/form/fieldset/button/span[2]').find_element_by_name('join') #xpath ๋ก ์ ๊ทผํ ์๋ ๋จผํธ์ ์์ join ์ด๋ผ๋ ์์ฑ์ ๊ฐ์ง tag ์๋ ๋จผํธ์ ์ ๊ทผ
์๋ ๋จผํธ ํด๋ฆญ
driver.find_element_by_id('ke_kbd_btn').click()
ํ ์คํธ ์ ๋ ฅ
driver.find_element_by_id('ke_awd2_btn').send_keys('ํ
์คํธ ์
๋ ฅ')
ํ ์คํธ ์ญ์
driver.find_element_by_id('ke_awd2_btn').clear()
๋จ์ถํค ์ ๋ ฅ
from selenium.webdriver.common.keys import Keys
# ์ปจํธ๋กค+V
driver.find_element_by_id('ke_kbd_btn').send_keys(Keys.CONTROL + 'v')
# ๋ค๋ฅธ ๋ฐฉ๋ฒ
from selenium.webdriver import ActionChains
ActionChains(driver).key_down(Keys.CONTROL).send_keys('V').key_up(Keys.CONTROL).perform()
#์์์ driver ๋์ ์๋ฆฌ๋จผํธ๋ฅผ ์
๋ ฅํด๋ ์ข์.
Frame ์ด๋
#์ด๋ํ ํ๋ ์ ์๋ฆฌ๋จผํธ ์ง์
element = driver.find_element_by_tag_name('iframe')
#ํ๋ ์ ์ด๋
driver.switch_to.frame(element)
#ํ๋ ์์์ ๋น ์ ธ๋์ค๊ธฐ
driver.switch_to.default_content()
๊ฒฝ๊ณ ์ฐฝ (alert)
๊ฒฝ๊ณ ์ฐฝ์ด ๋ด์ ๋ ์๋ฝ ๋๋ ๊ฑฐ์ ์ ๋๋ฌ์ฃผ๊ฑฐ๋ ๊ฒฝ๊ณ ์ฐฝ์ ํ ์คํธ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
๊ฒฝ๊ณ ์ฐฝ ์ด๋
#๊ฒฝ๊ณ ์ฐฝ์ผ๋ก ์ด๋
driver.switch_to.alert
๊ฒฝ๊ณ ์ฐฝ ์๋ฝ / ๊ฑฐ์
from selenium.webdriver.common.alert import Alert
Alert(driver).accept() #๊ฒฝ๊ณ ์ฐฝ ์๋ฝ ๋๋ฆ
Alert(driver).dismiss() #๊ฒฝ๊ณ ์ฐฝ ๊ฑฐ์ ๋๋ฆ
print(Alert(driver).text # ๊ฒฝ๊ณ ์ฐฝ ํ
์คํธ ์ป์
์ฟ ํค ๊ฐ ์ป๊ธฐ
#์ฟ ํค๊ฐ ์ป๊ธฐ
driver.get_cookies()
#์ฟ ํค ์ถ๊ฐ
driver.add_cookie()
#์ฟ ํค ์ ๋ถ ์ญ์
driver.delete_all_cookies()
#ํน์ ์ฟ ๊ธฐ ์ญ์
driver.delete_cookie(cookiename)
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์คํ
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋ค. ์์ฃผ ๊ทธ๋ฆฌ๊ณ ๋ง์ด ์ฌ์ฉํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ช๊ฐ๋ฅผ ์์๋ณธ๋ค.
์คํฌ๋กค ์ด๋
#๋ธ๋ผ์ฐ์ ์คํฌ๋กค ์ตํ๋จ์ผ๋ก ์ด๋
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
# CSS ์
๋ ํฐ๋ก ํด๋ฆญ
driver.execute_script("document.querySelector('body > div.modal-options__buttons > button.btn.btn-primary').click();")
#๋๋
elemToclick = driver.~~~
driver.execute_script('arguments[0].click();', elemToclick)
# driver.find_element_by_css_selector(~~).click() ๊ณผ ๋์ผํ๋ ์ด ์ฝ๋๊ฐ ์๋ํ์ง ์์์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์๋ํด๋ณผ๋งํ๋ค.
# ์คํฌ๋กค ํน์ ์๋ฆฌ๋จผํธ๋ก ์ด๋
element = driver.find_element_by_css_selector('div > a')
driver.execute_script('arguments[0].scrollIntoView(true);', element)
์ ํญ ์ด๊ธฐ
driver.execute_script('window.open("https://naver.com");')
์คํฌ๋ฆฐ์ท Screenshot
#์บก์ณํ ์๋ ๋จผํธ ์ง์
element = driver.driver.find_element_by_class_name('ico.search_submit')
#์บก์ณ
element.save_screenshot('image.png')
๋ค๋ก Back , ์์ผ๋ก Front
# ๋ค๋ก๊ฐ๊ธฐ
driver.back()
#์์ผ๋ก ๊ฐ๊ธฐ
driver.forward()
์์ธ์ฒ๋ฆฌ / Exceptions
from selenium.common.exceptions import NoAlertPresentException, NoSuchElementException, TimeoutException, ElementNotInteractableException,NoSuchWindowException, NoSuchFrameException
# NoAlertPresentException ๊ฒฝ๊ณ ์ฐฝ ๊ด๋ จ ๋ช
๋ น์ด๋ฅผ ์คํํ์ผ๋ ํ์ฌ ๊ฒฝ๊ณ ์ฐฝ์ด ๋จ์ง ์์
# NoSuchElementException ์๋ ๋จผํธ ์ ๊ทผํ์์ผ๋ ์์
# TimeoutException ํน์ ํ ์ก์
์ ์คํํ์์ผ๋ ์๊ฐ์ด ์ค๋ ์ง๋๋๋ก ์์์ด ์์
# ElementNotInteractableException ์๋ฆฌ๋จผํธ์ ํด๋ฆญ๋ฑ์ ํ์์ผ๋ ํด๋ฆญํ ์ฑ์ง์ ์๋ฆฌ๋จผํธ๊ฐ ์๋
# NoSuchWindowException ํด๋น ์๋์ฐ ์์
# NoSuchFrameException ํด๋น ํ๋ ์ ์์
shadow DOM ์ฒ๋ฆฌ
#shadow dom ์๋ ๋จผํธ ์ด์ด์ฃผ๋๋ฒ
element = driver.execute_script("return document.querySelector('#syndi_powerpage > div').shadowRoot").get_attribute('innerHTML') # css Selector ์ด์ฉ # element ์ HTML ๋ด์ฉ return
# shadow dom ์ฒ๋ฆฌ๋ฅผ ํตํ ํฌ๋กฌ ์ธํฐ๋ท ๊ธฐ๋ก ์ญ์
def expand_shadow_element(element):
shadow_root = driver.execute_script('return arguments[0].shadowRoot', element)
return shadow_root
driver.get('chrome://settings/clearBrowserData')
elem = driver.find_element_by_css_selector('body > settings-ui')
elem1 = expand_shadow_element(elem)
elem1 = elem1.find_element_by_id('main')
elem2 = expand_shadow_element(elem1)
elem2 = elem2.find_element_by_tag_name('settings-basic-page')
elem3 = expand_shadow_element(elem2)
elem3 = elem3.find_element_by_tag_name('settings-privacy-page')
elem4 = expand_shadow_element(elem3)
elem4 = elem4.find_element_by_tag_name('settings-clear-browsing-data-dialog')
elem5 = expand_shadow_element(elem4)
elem5forconfirmelem = expand_shadow_element(elem4) # ์ธํฐ๋ท ์ฌ์ฉ๊ธฐ๋ก ์ญ์ ๋ฒํผ ํด๋ฆญ์ ์ํ ์๋ ๋จผํธ ๋ฐ๋ก ๋นผ๋๊ธฐ
elem5 = elem5.find_element_by_id('clearFromBasic')
elem6 = expand_shadow_element(elem5)
elem6 = elem6.find_element_by_id('dropdownMenu')
elem6.find_element_by_css_selector('option[value="4"]').click() # ์ ์ฒด๊ธฐ๊ฐ ์ ํ
elem5forconfirmelem.find_element_by_id('clearBrowsingDataConfirm').click() #
'๐๏ธ์ํํธ์จ์ด > ๐ปpython' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python] os ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝ๋ก ์ค์ - os.getcwd(), path (0) | 2021.11.26 |
---|---|
jupyter_notebook_config.json error ์๋ฌ ์์ธ ๋ฐ ํด๊ฒฐ ๋ฐฉ๋ฒ (0) | 2021.11.26 |
Only the following pseudo-classes are implemented: nth-of-type. ์๋ฌ(error) (0) | 2021.11.25 |
์ ํ๋ธ ์ฌ์ดํธ ํฌ๋กค๋ง(๋งํฌ, href) (0) | 2021.11.25 |
'list' object has no attribute 'find_all' ์๋ฌ (0) | 2021.11.25 |