seleium ์น ๋ธ๋ผ์ฐ์ ์๋ํ ๋๊ตฌ ํ์ฉ๋ฒ [ Python์ผ๋ก ์น ์์ ์๋ํ ]
Selenium์ผ๋ก ์๋ํ๋ ํ ์คํธ์ ์น ์คํฌ๋ํ ํจ์จ์ ์ผ๋ก ๊ตฌํํ๊ธฐ
Selenium์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ์ ์ดํ ์ ์๋ ์คํ ์์ค [ ์น ๋ธ๋ผ์ฐ์ ์๋ํ ๋๊ตฌ]๋ก, ์ฃผ๋ก Python๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. Selenium์ ๋ค์ํ ์น ๋ธ๋ผ์ฐ์ ์ ํธํ๋๋ฉฐ, ์ฌ์ฉ์๋ ์ง์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์กฐ์ํ๋ ๊ฒ์ฒ๋ผ ์น ํ์ด์ง์ ์ํธ์์ฉํ ์ ์์ต๋๋ค.
์น ๋ธ๋ผ์ฐ์ ์๋ํ
์ด๋ ์น ์คํฌ๋ํ, ์๋ํ๋ ํ ์คํธ, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ํธ์์ฉ ๋ฑ ์ฌ๋ฌ ์์ ์์ ์๋ํ ์์ ์ ํ ์ ์์ต๋๋ค.
์น ๋ธ๋ผ์ฐ์ ์๋ํ
Selenium์ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ํํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์ํํ๋ ์์ , ์๋ฅผ ๋ค์ด ์น ํ์ด์ง๋ฅผ ์ด๊ณ ํด๋ฆญํ๊ฑฐ๋, ํผ์ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ณ ์ ์ถํ๋ ๋ฑ์ ๋์์ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์คํํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ฐ๋ณต์ ์ธ ์์ ์ ์ค์ด๊ณ , ํ ์คํธ ๋๋ ์คํฌ๋ํ ์์ ์ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๊ฒ ํฉ๋๋ค.
์น ๋ธ๋ผ์ฐ์ ์๋ํ๋ ํนํ ์ฌ์ฉ์๊ฐ ๋ง์ ์ํธ์์ฉ์ ์๊ตฌํ๋ ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฃฐ ๋ ์ ์ฉํฉ๋๋ค. Selenium์ ์ด๋ฌํ ๋ธ๋ผ์ฐ์ ์ํธ์์ฉ์ ์๋์ผ๋ก ์ฒ๋ฆฌํจ์ผ๋ก์จ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ์ ์ฝํ ์ ์๊ฒ ํด์ค๋๋ค.
์น ์คํฌ๋ํ
Selenium์ ์น ํ์ด์ง์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๋ฐ์๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. ์ ํต์ ์ธ ์น ์คํฌ๋ํ ๋๊ตฌ์ ๋ฌ๋ฆฌ, Selenium์ JavaScript๋ก ๋์ ์ผ๋ก ๋ ๋๋ง๋๋ ์น ํ์ด์ง๋ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ด๋ก ์ธํด ๋ณต์กํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ Ajax๋ฅผ ์ฌ์ฉํ๋ ํ์ด์ง์์ ์ ๋ณด๋ฅผ ์์งํ๋ ๋ฐ ๊ฐ์ ์ ๊ฐ์ง๋๋ค.
Selenium์ ์น ์คํฌ๋ํ์ ์ฌ์ฉํ ๋๋, ์น ์ฌ์ดํธ์ ๋ก๋ด ๋ฐฐ์ ํ์ค(Robots.txt) ๋ฐ ๋ฒ์ ์ ํ์ ์ค์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋งคํฌ๋ก ์๋ํ ํ๋ก๊ทธ๋จ์ผ๋ก ์ฌ์ฉ์ ์ฃผ์ ํด์ผ ํฉ๋๋ค.
์๋ํ๋ ํ ์คํธ
Selenium์ ์๋ํ๋ ํ ์คํธ์์๋ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
ํนํ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ํ์ง ๋ณด์ฆ(QA)๊ณผ ์ง์์ ์ธ ํตํฉ(CI) ํ๊ฒฝ์์ ์ ์ฉํฉ๋๋ค. Selenium์ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ํ ์คํธํ๋ฉด ์๋ ํ ์คํธ์์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ค์ด๊ณ , ๋ค์ํ ํ๊ฒฝ์์์ ์ผ๊ด์ฑ์ ํ๋ณดํ ์ ์์ต๋๋ค.
Selenium์ ๋ฒํผ ํด๋ฆญ, ์ ๋ ฅ ํ๋ ์์ฑ, ํ์ด์ง ํ์ ๋ฑ์ ๋์์ ์๋์ผ๋ก ์ํํ๋ฉฐ, ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ํํธ์จ์ด์ ๊ฒฐํจ์ ๋น ๋ฅด๊ฒ ๋ฐ๊ฒฌํ๊ณ ์์ ํ ์ ์๊ฒ ํฉ๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ํธ์์ฉ
Selenium์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ์์ฉํ๋ ๋ฐ ์์ด ๋งค์ฐ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์ ๋ก๊ทธ์ธ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๊ฑฐ๋, ๊ฒ์ ๊ธฐ๋ฅ์ ํตํด ํน์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฑ์ ์์ ์ ์๋ํํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ํธ์์ฉ์ ํตํด ์ฌ์ฉ์๋ ์ค์ ์ฌ์ฉ์ ํ๋์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ๋ณต์กํ ํ ์คํธ ์๋๋ฆฌ์ค๋ฅผ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ฌ์ฉ์ ๊ฒฝํ์ ํ ์คํธํ ์ ์์ต๋๋ค.
Selenium ๋ชจ๋์ ๊ตฌ์ฑ
Selenium์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ฌ๋ฌ ํ์ ๋ชจ๋๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๊ฐ ๋ชจ๋์ ํน์ ํ ์ญํ ์ ๋ด๋นํฉ๋๋ค.
selenium.webdriver
์ด ๋ชจ๋์ Selenium์ ํต์ฌ ๋ชจ๋๋ก, ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ ์ดํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. Selenium์ Chrome, Firefox, Safari ๋ฑ ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ๋ํ ์ง์์ ์ ๊ณตํ๋ฉฐ, ๊ฐ ๋ธ๋ผ์ฐ์ ๋ง๋ค ๋ณ๋์ WebDriver๊ฐ ์กด์ฌํฉ๋๋ค.
์ด WebDriver๋ฅผ ์ฌ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ์ฐฝ์ ์ด๊ณ , ํ์ด์ง๋ฅผ ๋ก๋ํ๋ฉฐ, ์ฌ์ฉ์ ์ ๋ ฅ๊ณผ ๊ฐ์ ๋ค์ํ ์ํธ์์ฉ์ ํ ์ ์์ต๋๋ค.
selenium.webdriver.common.by
์ด ๋ชจ๋์ ์น ์์๋ฅผ ์ฐพ๊ธฐ ์ํ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์๋ฅผ ๋คBy.ID
,By.NAME
,By.XPATH
,By.CSS_SELECTOR
๋ฑ๊ณผ ๊ฐ์ ๋ฐฉ์์ ํตํด ํน์ ์น ์์๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ณด๋ค ์ ๊ตํ๊ฒ ์น ํ์ด์ง ๋ด ์์๋ฅผ ํ์ํ๊ณ ์กฐ์ํ ์ ์์ต๋๋ค.
selenium.webdriver.common.keys
์ด ๋ชจ๋์ ํค๋ณด๋ ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Enter ํค๋ฅผ ๋๋ฅด๊ฑฐ๋, ํ์ดํ ํค๋ก ํ์ด์ง๋ฅผ ์คํฌ๋กคํ๋ ๋ฑ์ ์์ ์ ์๋ํํ ์ ์์ต๋๋ค. ์ด๋ ํ ์คํธ ์ ๋ ฅ ํผ์ ์๋์ผ๋ก ์์ฑํ๊ฑฐ๋ ํน์ ํค ์กฐํฉ์ ํตํด ํ์ด์ง๋ฅผ ์กฐ์ํ ๋ ์ ์ฉํฉ๋๋ค.
selenium.common.exceptions
Selenium์ ๋ค์ํ ์ํฉ์์ ์์ธ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ์ด ๋ชจ๋์ ๊ทธ๋ฐ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. NoSuchElementException
์ ํน์ ์์๋ฅผ ์ฐพ์ ์ ์์ ๋ ๋ฐ์ํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฝ๋๊ฐ ์ค๋จ๋์ง ์๊ณ ์์ธ ์ํฉ์ ์ ์ ํ ๋์ฒํ ์ ์์ต๋๋ค.
selenium.webdriver.support.ui.WebDriverWait
์น ํ์ด์ง ๋ก๋ ์, ํน์ ์์๊ฐ ๋ํ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ ์ํฉ์ด ์ข ์ข ๋ฐ์ํฉ๋๋ค. ์ด ๋ชจ๋์ ์ฌ์ฉ์๊ฐ ์ํ๋ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ํ์ด์ง ๋ก๋ฉ์ด ์๋ฃ๋๊ฑฐ๋ ํน์ ๋ฒํผ์ด ํ์ฑํ๋ ๋๊น์ง ๋๊ธฐํ ํ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
selenium.webdriver.support.expected_conditions
์ด ๋ชจ๋์ ํน์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์๋์ง ํ์ธํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋WebDriverWait
๊ณผ ํจ๊ป ์ฌ์ฉ๋์ด, ์น ํ์ด์ง์ ํน์ ์์๊ฐ ํ์๋์๋์ง, ๋๋ ํด๋ฆญํ ์ ์๋ ์ํ์ธ์ง ํ์ธํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
from selenium import webdriver # ์น ๋ธ๋ผ์ฐ์ ์๋ํ๋ฅผ ์ํ ๋ชจ๋
from selenium.webdriver.common.by import By # ์์ ์ฐพ๊ธฐ๋ฅผ ์ํ ๋ชจ๋
from selenium.webdriver.common.keys import Keys # ํน์ ํค ์
๋ ฅ์ ์ํ ๋ชจ๋
from selenium.common.exceptions import NoSuchElementException
# ์์๋ฅผ ์ฐพ์ง ๋ชปํ์ ๋ ๋ฐ์ํ๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ชจ๋
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC