1. ์ธ์ ์ข ๋ฃ
๋ธ๋ผ์ฐ์ ์์ ์ธ์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ข ๋ฃํ๋ ๋ฐฉ๋ฒ
์, ์ฌ๋ฌ๋ถ์ ๋ฉ์ง ์คํฌ๋ฆฝํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ผ๊ณ , ๋ฒํผ์ ํด๋ฆญํ๋ฉฐ ๋ธ๋ผ์ฐ์ ์์ ๋ง๋ฒ ๊ฐ์ ์ผ์ ํ๊ณ ์์ต๋๋ค.
์ด์ ์ค์ํ ๊ฒ์ ๊ทธ๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ข
๋ฃํ๋ ๊ฒ์
๋๋ค. ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฑ๊ธํ ๋ฐฉ์์ผ๋ก ๋ซ์ ์ ์์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ฅผ ๋๊ธํ ์ฝ๋ผ๋ฆฌ๋ก ์์ํด๋ณด์ธ์: ๊ทธ๋ฅ ๋ฌธ์ ๋ซ๊ณ ๋๊ฐ ์ ์์ต๋๋ค.
์์ ์๊ฒ ํํ๋กญ๊ฒ ์ข
๋ฃํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด quit()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ธ์.
from selenium import webdriver
# ๋ธ๋ผ์ฐ์ ๋๋ผ์ด๋ฒ ์ด๊ธฐํ
driver = webdriver.Chrome()
# ์ฌ๊ธฐ์ ๋ธ๋ผ์ฐ์ ๋ง๋ฒ์ด ์งํ๋ฉ๋๋ค... ๐งโโ๏ธ
# ๋ธ๋ผ์ฐ์ ์ข
๋ฃ
driver.quit()
quit()
๋ฉ์๋๋ ๋ธ๋ผ์ฐ์ ์ ๋ชจ๋ ์ฐฝ์ ๋ซ๊ณ ์์
์ ์ข
๋ฃํฉ๋๋ค. ๋ง์ฝ ์ด๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์์ผ๋ฉด,
๋ฐฑ๊ทธ๋ผ์ด๋์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ ค ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๋ ์ด์ํ ์ด์ผ๊ธฐ๊ฐ ์์๋ ์ ์์ต๋๋ค. ๋ชจ๋ ํ๋ณตํ ์ถ์ ์ํ์์์.
๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋จ์์๋ ๋ธ๋ผ์ฐ์ ํ๋ก์ธ์ค ๋ฌธ์ ํด๊ฒฐ
๊ฐ๋ Selenium ์ฌ์ฉ ํ ๋ธ๋ผ์ฐ์ ํ๋ก์ธ์ค๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋จ์์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
๋ง์น ์ค์๊ฐ ์ ๋ต ๊ฒ์์์ ๋ง์ค์ด๋ ์ ๋์ฒ๋ผ์.
์ด๋ ์คํฌ๋ฆฝํธ๊ฐ ์คํ ์ค๊ฐ์ "ํฌ๋์" ๋ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ psutil
๊ฐ์ Python์ ๋ชจ๋์ด๋ ๋ค๋ฅธ ์์คํ
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ๋ฐฐ์น ์ข
๋ฃํ๋ ๊ฒ์
๋๋ค.
import psutil
# Chrome์ ๋จ์์๋ ๋ชจ๋ ํ๋ก์ธ์ค ๋ซ๊ธฐ
for proc in psutil.process_iter():
# ํ๋ก์ธ์ค๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ํ๋์ง ํ์ธ
if 'chrome' in proc.name().lower():
proc.kill()
์ด ๋ฐฉ๋ฒ์ ๊ฐ์ฅ ์ธ๋ จ๋ ๋ฐฉ๋ฒ์ ์๋์ง๋ง, ํ๋ก์ธ์ค๊ฐ ์ ์ด ๋ถ๊ฐ๋ฅํด์ง ๊ฒฝ์ฐ ํผํ ์ ์๋ ์ ํ์ง๊ฐ ๋ ์ ์์ต๋๋ค. ์ด๋ด ๋ ๋ธ๋ผ์ฐ์ ์ ๋ชจ๋ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ๊ฒ ๋๋ ์ ์คํ๊ฒ ์ฌ์ฉํ์ธ์.
2. ์คํฌ๋ฆฝํธ ํ ์คํธ
์๋๋ฆฌ์ค์ ๋ชจ๋ ๋จ๊ณ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์คํํ๋์ง ํ์ธ
์คํฌ๋ฆฝํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ข
๋ฃํ๋ ๊ฒ์ ์ผ์ด ์ ๋ฐ๋ฐ์ ๋๋ ๊ฒ์ด ์๋๋๋ค.
๊ฐ ๋จ๊ณ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์คํ๋๊ณ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ฅผ ์ํด
์ํํธ์จ์ด ํ
์คํธ ๋๊ตฌ,
์๋ฅผ ๋ค๋ฉด unittest
๋๋ pytest
์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด ์คํฌ๋ฆฝํธ๊ฐ ํ์ด์ง๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ด๊ณ , ๋ฒํผ์ ํด๋ฆญํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ผ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
unittest
๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ ํ
์คํธ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
import unittest
from selenium import webdriver
class TestBrowserAutomation(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def test_open_page(self):
self.driver.get("https://example.com")
self.assertEqual("Example Domain", self.driver.title)
def tearDown(self):
self.driver.quit()
unittest.main()
์ด ํ ์คํธ๋ ์คํฌ๋ฆฝํธ๊ฐ https://example.com ํ์ด์ง๋ฅผ ์ด๊ณ , ํ์ด์ง ์ ๋ชฉ์ด ์์๊ณผ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค. ๊ฐ๋จํ์ง๋ง ์ค์ํ ๋ถ๋ถ์ด ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ ์ ์๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ๋๋ค.
๋๋ฒ๊น ๋ฐ ์ต์ ํ
๋๋๋ก ํ
์คํธ๋ฅผ ์์ฑํ ํ์๋ ์คํฌ๋ฆฝํธ๊ฐ ๋ง์น ๊ณ ์ง ์ผ ์์ด์ฒ๋ผ ์ ๋๋ก ์๋ํ์ง ์์ ๋๊ฐ ์์ต๋๋ค.
์ด๋ด ๋ ๋๋ฒ๊น
์ด ํ์ํฉ๋๋ค. print()
๋ฅผ ์ฌ์ฉํด์ ์ค๊ฐ๊ฐ์ ์ถ๋ ฅํด ์ด๋ค ๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ฐพ์๋ณด์ธ์.
์ฝ๋์ ์ฌ๋ฏธ์๋ ์ฃผ์์ ์ถ๊ฐํ๋ ๊ฒ์ ํ์์ด์ง๋ง, ๋ชฉํ๋ ๋ฌธ์ ๋ฅผ ์ดํดํ๋ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด, some_element๊ฐ ํ์ด์ง์ ์๋ค๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค:
try:
some_element = driver.find_element_by_id('missing-id')
except Exception as e:
print(f"Whoops! Something went wrong: {e}")
๋ํ ์คํฌ๋ฆฝํธ ์ฑ๋ฅ์ ์ฃผ์ ๊น๊ฒ ๊ด์ฐฐํ์ธ์. ๊ฐ๋ ์์ ์ ์ต์ ํํ๋ ค๋ฉด ์์ฒญ ๋น๋๋ฅผ ์ค์ด๊ฑฐ๋ ์์ ๊ฒ์ ๋ก์ง์ ์ต์ ํํ๋ ๋ฑ ๋ค์ํ ์ ๋ต์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฏธ๋์ ์ถฉ๋๊ณผ ์ค๋ฅ ๋ฐฉ์ง
์ต์ ํ์ ๋๋ฒ๊น
์ดํ์๋ ์คํฌ๋ฆฝํธ๊ฐ ์ค์์ค ์๊ณ์ฒ๋ผ ์๋ฒฝํ๊ฒ ์๋ํด์ผ ํ์ง๋ง, ํญ์ ์๋ก์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ์์ต๋๋ค.
logging
์ ๊ฐ์ ๋ก๊น
์์คํ
์ ์ฌ์ฉํด ์คํฌ๋ฆฝํธ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋์ง ๊ธฐ๋กํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด ๋ฌด์ธ๊ฐ ์๋ชป๋์์ ๋ ์ด๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ ์ ์์ต๋๋ค.
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info("์คํฌ๋ฆฝํธ ์์")
# ์ฌ๊ธฐ์ ์ฌ๋ฌ ๋์๋ค์ ๊ธฐ๋กํ์ธ์...
logger.info("์คํฌ๋ฆฝํธ ์ข
๋ฃ")
์์์น ๋ชปํ ์ํฉ์ ๋ํ ๋๋น๋ ํญ์ ํ์ํฉ๋๋ค, ํนํ ๋ถ์์ ํ ๋ฐ์ดํฐ๋ ํ์ด์ง์ ์์ ์ค์ผ ๋ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์คํฌ๋ฆฝํธ๊ฐ ์ฌ์ํ ๋ฌธ์ ๋ก ์ค๋จ๋์ง ์๋๋ก ์ฌ์๋์ ํ์์์ ์์คํ ์ ๋์ ํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณด์ธ์.
GO TO FULL VERSION