Selenium 프로필 적용 및 창 제어

2024. 1. 24. 10:04IT관련

반응형

셀레늄(Selenium)

Selenium으로 자동화를 실행하다 보면 기존 chrome에서 사용하던 프로필을 사용해야 할때가 있다.

이때 chrome 주소창에 chrome://version을 입력하면 프로필이 어디에 있는지 확인할 수 있다.

chrome://version

프로필에 자세한 내용은 아래 링크를 참고하면 된다.

User Data Directory

 

Chromium Docs - User Data Directory

User Data Directory Introduction The user data directory contains profile data such as history, bookmarks, and cookies, as well as other per-installation local state. Each profile is a subdirectory (often Default) within the user data directory. Current Lo

chromium.googlesource.com

 

Command line에서 chrome 실행시 user-data-dir 옵션을 이용하여 프로필 경로를 지정할 수도 있다.

chrome.exe --user-data-dir=c:\foo

 

이 user-data-dir 옵션을 이용하면 자동화시 나의 프로필을 적용할 수도 있고, 자동화시 사용할 프로필을 신규로 만들어 사용할 수도 있다.

 

그리고 selenium 실행시 매번 chrome이 새창으로 표시되는데, 이걸 하나의 window로 관리할 수도 있다. 이를 위해서는 remote debugging 옵션을 사용하면 된다.

chrome.exe --remote-debugging-port=9222 --user-data-dir=remote-profile

Chrome 실행시 remote denugging port를 지정해 두면 이후 해당 포트로 연결하여 실행중인 chrome을 제어할 수 있다. Chrome DevTools에서 이걸 사용한다고 한다.

 

예제 코드

from selenium import webdriver
from selenium.webdriver.common.by import By

PORT = 9222

if __name__ == '__main__':
    # 크롬 드라이버 생성
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument(r'user-data-dir=C:\remote-profile')  # Profile 경로 지정
    chrome_options.add_argument(f'remote-debugging-port={PORT}') # 디버깅 포트 설정
    chrome_options.add_experimental_option('detach', True)
    driver = webdriver.Chrome(options=chrome_options)

    # 불필요한 크롬창 제거
    if len(driver.window_handles) > 1:
        for handle in driver.window_handles[:-1]:
            driver.switch_to.window(handle)
            driver.close()
    driver.switch_to.window(driver.window_handles[0])
    driver.get('https://www.naver.com') # URL로 이동

    input = driver.find_element(By.XPATH, '//*[@id="query"]')
    input.send_keys('selenium')

    search = driver.find_element(By.XPATH, '//*[@id="sform"]/fieldset/button')
    search.click()

    print('end')

Chrome에서 지원하는 옵션들은  add_argument를 이용하여 적용할 수 있다.

 

위 코드를 보면 c:\remote-profile로 프로필 경로를 지정했다. 만약 해당 폴더가 없다면 신규로 생성된다.

chrome_options.add_argument(r'user-data-dir=C:\remote-profile')  # Profile 경로 지정

 

그리고 remote-debugging-port를 9222로 지정하여 chrome을 실행하기 때문에 다시 이 코드가 또 실행되어도 9222 포트로 실행중인 chrome을 찾아 연결후 그 chrome을 네이버로 이동시킬 것이다. 만약 해당 포트로 실행중인 chrome이 없다면 그냥 새창이 뜬다.

PORT = 9222
chrome_options.add_argument(f'remote-debugging-port={PORT}') # 디버깅 포트 설정

 

Remote로 네이버로 이동하고 나면 불필요하게 빈 chrome이 덩그러니 남아 있는데, 이건 아래 코드로 닫아버릴 수 있다.

# 불필요한 크롬창 제거
if len(driver.window_handles) > 1:
    for handle in driver.window_handles[:-1]:
        driver.switch_to.window(handle)
        driver.close()
driver.switch_to.window(driver.window_handles[0])

 

Selenium remote-debugging-port

 

 

반응형