본문 바로가기
카테고리 없음

Selenium과 WebDriver의 크롬 인스턴스 연동 세팅

by 퍼포먼스마케팅코더 2024. 1. 15.
반응형

안녕하세요! 오늘은 Python과 Selenium을 사용하여 Chrome 브라우저를 자동화하는 방법에 대해 알아보겠습니다. 이 방법은 웹 페이지 테스트, 데이터 스크래핑 등 다양한 목적으로 사용될 수 있습니다.

시작하기 전에

우선 필요한 라이브러리를 임포트합니다. subprocess, os, socket는 시스템과 네트워크 상호작용을 위해, selenium은 웹 브라우저의 자동화를 위해 사용됩니다.

import subprocess
import os
import socket
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException, TimeoutException
from selenium.webdriver.common.by import By
import configparser

주요 기능들

  1. 사용 가능한 포트 찾기: find_free_port 함수는 사용 가능한 네트워크 포트를 찾아 반환합니다. 이는 Chrome을 디버깅 모드로 실행할 때 필요합니다.
  2. Chrome 디버깅 모드 실행: start_chrome 함수는 Chrome을 디버깅 모드로 실행합니다. 이렇게 실행된 Chrome은 Selenium을 통해 제어될 수 있습니다.
  3. Chrome WebDriver 설정 및 연결: setup_chrome_driver 함수는 Selenium WebDriver를 설정하고, Chrome에 연결합니다.
  4. 설정 파일 로드: load_config 함수는 Chrome 실행 파일과 드라이버 경로를 config.ini 파일에서 읽어옵니다. 이렇게 하면 코드 수정 없이 설정을 변경할 수 있습니다.

자동화 프로세스

  1. 설정 파일에서 Chrome 경로와 드라이버를 로드합니다.
  2. 사용 가능한 포트를 찾고, 해당 포트에서 Chrome을 실행합니다.
  3. WebDriver를 설정하고, "https://www.naver.com"으로 이동합니다.
  4. WebDriverWait를 사용하여 페이지의 "body" 태그가 로드될 때까지 최대 10초간 대기합니다.

예외 처리 및 종료

페이지 로딩 시간이 초과되면 TimeoutException을 통해 예외 처리를 하고, 작업 완료 후 WebDriver와 Chrome 프로세스를 안전하게 종료합니다.

마치며

이 방법을 통해 Python과 Selenium을 사용하여 웹 브라우저를 효율적으로 자동화할 수 있습니다. 설정 파일을 사용함으로써 코드의 유연성을 높일 수 있고, WebDriver의 대기 기능을 통해 로딩 시간을 최적화할 수 있습니다. 이것은 웹 테스트나 데이터 수집에 매우 유용할 것입니다.


이 글이 여러분의 프로젝트에 도움이 되길 바랍니다! 다음 포스팅에서 더 유용한 정보로 찾아뵙겠습니다. 😊👋

전체 코드

import subprocess
import os
import socket
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import WebDriverException, TimeoutException
from selenium.webdriver.common.by import By
import configparser

def find_free_port():
    """ 사용 가능한 포트 찾기 """
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind(('', 0))
        return s.getsockname()[1]

def start_chrome(chrome_path, port):
    """ Chrome을 디버깅 모드로 실행 """
    try:
        chrome_command = [chrome_path, f'--remote-debugging-port={port}']
        return subprocess.Popen(chrome_command)
    except subprocess.SubprocessError as e:
        print(f"Chrome 실행 에러: {e}")
        return None

def setup_chrome_driver(chrome_driver_path, port):
    """ Chrome WebDriver 설정 및 연결 """
    try:
        chrome_options = Options()
        chrome_options.add_experimental_option("debuggerAddress", f"localhost:{port}")
        return webdriver.Chrome(executable_path=chrome_driver_path, options=chrome_options)
    except WebDriverException as e:
        print(f"WebDriver 설정 에러: {e}")
        return None

def load_config():
    """ 설정 파일 로드 """
    config = configparser.ConfigParser()

    #해당 설정 파일에 Chrome 과 webdriver 경로를 포함돼 있음.
    config.read(r'C:\Users\user2401\chrome_config\config.ini')
    return config['chrome']['path'], config['chrome']['driver_path']

# 설정 파일에서 Chrome 실행 파일 및 드라이버 경로 로드
chrome_path, chrome_driver_path = load_config()

# 사용 가능한 포트 찾기
debugging_port = find_free_port()

# Chrome 실행 및 WebDriver 설정
chrome_process = start_chrome(chrome_path, debugging_port)
driver = setup_chrome_driver(chrome_driver_path, debugging_port)

try:
    driver.get("https://www.naver.com")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
    print("접속완료")
except TimeoutException:
    print("페이지 로딩 시간 초과")

# 사용 후 정리
if driver:
    driver.quit()
if chrome_process:
    chrome_process.terminate()

 

메모장을 사용하여 config.ini 파일을 생성하고 설정하는 방법

  1. 메모장 열기: 필요한 설정 정보를 입력하기 위해 Windows 메모장을 엽니다.
  2. 내용 입력: 메모장에 Chrome 실행 파일 및 드라이버 경로를 기입합니다.
  3. 파일 저장: '모든 파일' 형식으로 config.ini라는 이름으로 저장합니다. .txt가 아닌 .ini 확장자를 사용해야 합니다.
  4. 적절한 위치에 저장: Python 스크립트와 같은 디렉토리에 저장하여 스크립트가 파일을 쉽게 찾을 수 있도록 합니다.

이 파일은 Python 스크립트에서 load_config 함수로 읽을 수 있습니다.

반응형

댓글