CodeGym /ํ–‰๋™ /Python SELF KO /์Šคํฌ๋ฆฝํŠธ ์ข…๋ฃŒ ๋ฐ ํ…Œ์ŠคํŠธ

์Šคํฌ๋ฆฝํŠธ ์ข…๋ฃŒ ๋ฐ ํ…Œ์ŠคํŠธ

Python SELF KO
๋ ˆ๋ฒจ 36 , ๋ ˆ์Šจ 4
์‚ฌ์šฉ ๊ฐ€๋Šฅ

1. ์„ธ์…˜ ์ข…๋ฃŒ

๋ธŒ๋ผ์šฐ์ € ์ž‘์—… ์„ธ์…˜์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ข…๋ฃŒํ•˜๋Š” ๋ฐฉ๋ฒ•

์ž, ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ฉ‹์ง„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์œผ๊ณ , ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋งˆ๋ฒ• ๊ฐ™์€ ์ผ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์„ฑ๊ธ‰ํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ซ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋Š๊ธ‹ํ•œ ์ฝ”๋ผ๋ฆฌ๋กœ ์ƒ์ƒํ•ด๋ณด์„ธ์š”: ๊ทธ๋ƒฅ ๋ฌธ์„ ๋‹ซ๊ณ  ๋‚˜๊ฐˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ์˜ ์žˆ๊ฒŒ ํ‰ํ™”๋กญ๊ฒŒ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด quit() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

Python

from selenium import webdriver

# ๋ธŒ๋ผ์šฐ์ € ๋“œ๋ผ์ด๋ฒ„ ์ดˆ๊ธฐํ™”
driver = webdriver.Chrome()

# ์—ฌ๊ธฐ์„œ ๋ธŒ๋ผ์šฐ์ € ๋งˆ๋ฒ•์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค... ๐Ÿง™โ€โ™‚๏ธ

# ๋ธŒ๋ผ์šฐ์ € ์ข…๋ฃŒ
driver.quit()

quit() ๋ฉ”์„œ๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์˜ ๋ชจ๋“  ์ฐฝ์„ ๋‹ซ๊ณ  ์ž‘์—…์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์žŠ์œผ๋ฉด, ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ด๋ ค ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด์ƒํ•œ ์ด์•ผ๊ธฐ๊ฐ€ ์‹œ์ž‘๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘ ํ–‰๋ณตํ•œ ์‚ถ์„ ์›ํ•˜์ž–์•„์š”.

๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‚จ์•„์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ € ํ”„๋กœ์„ธ์Šค ๋ฌธ์ œ ํ•ด๊ฒฐ

๊ฐ€๋” Selenium ์‚ฌ์šฉ ํ›„ ๋ธŒ๋ผ์šฐ์ € ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ๋‚จ์•„์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์น˜ ์‹ค์‹œ๊ฐ„ ์ „๋žต ๊ฒŒ์ž„์—์„œ ๋ง์„ค์ด๋Š” ์œ ๋‹›์ฒ˜๋Ÿผ์š”. ์ด๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰ ์ค‘๊ฐ„์— "ํฌ๋ž˜์‹œ" ๋œ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” psutil ๊ฐ™์€ Python์˜ ๋ชจ๋“ˆ์ด๋‚˜ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฐ์น˜ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Python

import psutil

# Chrome์— ๋‚จ์•„์žˆ๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค ๋‹ซ๊ธฐ
for proc in psutil.process_iter():
    # ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ์†ํ•˜๋Š”์ง€ ํ™•์ธ
    if 'chrome' in proc.name().lower():
        proc.kill()

์ด ๋ฐฉ๋ฒ•์€ ๊ฐ€์žฅ ์„ธ๋ จ๋œ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ œ์–ด ๋ถˆ๊ฐ€๋Šฅํ•ด์งˆ ๊ฒฝ์šฐ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ์„ ํƒ์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ๋ธŒ๋ผ์šฐ์ €์˜ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ฒŒ ๋˜๋‹ˆ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์„ธ์š”.

2. ์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธ

์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰ํ•˜๋Š”์ง€ ํ™•์ธ

์Šคํฌ๋ฆฝํŠธ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ์€ ์ผ์ด ์ ˆ๋ฐ˜๋ฐ–์— ๋๋‚œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ ๋„๊ตฌ, ์˜ˆ๋ฅผ ๋“ค๋ฉด unittest ๋˜๋Š” pytest์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ด๊ณ , ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ์œผ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

unittest๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

Python

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๊ฐ€ ํŽ˜์ด์ง€์— ์—†๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค:

Python

try:
    some_element = driver.find_element_by_id('missing-id')
except Exception as e:
    print(f"Whoops! Something went wrong: {e}")

๋˜ํ•œ ์Šคํฌ๋ฆฝํŠธ ์„ฑ๋Šฅ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ๊ด€์ฐฐํ•˜์„ธ์š”. ๊ฐ€๋” ์ž‘์—…์„ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด ์š”์ฒญ ๋นˆ๋„๋ฅผ ์ค„์ด๊ฑฐ๋‚˜ ์š”์†Œ ๊ฒ€์ƒ‰ ๋กœ์ง์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ์ „๋žต์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์˜ ์ถฉ๋Œ๊ณผ ์˜ค๋ฅ˜ ๋ฐฉ์ง€

์ตœ์ ํ™”์™€ ๋””๋ฒ„๊น… ์ดํ›„์—๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์Šค์œ„์Šค ์‹œ๊ณ„์ฒ˜๋Ÿผ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•˜์ง€๋งŒ, ํ•ญ์ƒ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์žˆ์Šต๋‹ˆ๋‹ค. logging์™€ ๊ฐ™์€ ๋กœ๊น… ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ด ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฌด์–ธ๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์„ ๋•Œ ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Python

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info("์Šคํฌ๋ฆฝํŠธ ์‹œ์ž‘")

# ์—ฌ๊ธฐ์„œ ์—ฌ๋Ÿฌ ๋™์ž‘๋“ค์„ ๊ธฐ๋กํ•˜์„ธ์š”...

logger.info("์Šคํฌ๋ฆฝํŠธ ์ข…๋ฃŒ")

์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํ™ฉ์— ๋Œ€ํ•œ ๋Œ€๋น„๋Š” ํ•ญ์ƒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค, ํŠนํžˆ ๋ถˆ์•ˆ์ •ํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ํŽ˜์ด์ง€์™€ ์ž‘์—… ์ค‘์ผ ๋•Œ ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๋กœ ์ค‘๋‹จ๋˜์ง€ ์•Š๋„๋ก ์žฌ์‹œ๋„์™€ ํƒ€์ž„์•„์›ƒ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.

1
ะžะฟั€ะพั
ํผ ์ž‘์—…ํ•˜๊ธฐ,ย  36 ัƒั€ะพะฒะตะฝัŒ,ย  4 ะปะตะบั†ะธั
ะฝะตะดะพัั‚ัƒะฟะตะฝ
ํผ ์ž‘์—…ํ•˜๊ธฐ
ํผ ์ž‘์—…ํ•˜๊ธฐ
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION