본문 바로가기
코딩취미/Python

selenium4.11.2, python3.9 적용하며 바뀐 것들 : find_element_by_css_selector, Options, Service

by 브링블링 2024. 4. 3.
반응형

selenium4.11.2, python3.9 적용하며 바뀐 것들 : (삽질기록)

find_element_by_css_selector, Options, Service

크롤링으로 필요한 데이터를 다운받고 리포트를 하기 위해서 GUI S/W를 만들었습니다. 2년정도 잘 사용하고 있다가 노트북을 바꾸면서 개발환경을 모두 바꾸게 됐는데, 이때 파이썬이 3.7에서 3.9로 업데이트되고, 개발툴도 python IDLE에서 Visual Studio로 변경했습니다. 그리고 기존에 만들었던 S/W의 기능을 개선하기 위해서 다시 셋팅하고 동작을 시키는데, 되질 않았습니다. 역시 환경이 바뀌니 문제가 생겼습니다. 예상했었는데, 경험하고 싶지는 않았습니다. 아무튼 이번 포스팅에서는 크롤링이 되지 않았던 문제와 크롬브라우저의 터미널창이 생성되는 문제를 해결하는 내용을 정리합니다.

find_elements API 문제

self.driver.find_element_by_css_selector(element_css_ProductionInformation).click()
AttributeError: 'WebDriver' object has no attribute 'find_element_by_css_selector

 

기존에 사용하던 함수들이 동작되지 않았습니다.

(find_element_by_css_selector, find_element_by_name, find_element_by_id) 

함수명은 find_element로 변경되고 이후의 내용은 By.인자로 전달하는 구조로 변경됐습니다.

Selenium 4에서는 find_element_by_* 메소드들이 더 이상 직접 사용되지 않고, 대신 find_element 메소드와 By 클래스를 사용하는 방식으로 변경되었습니다. 이전의 find_element_by_css_selector 메소드 대신 find_element 메소드를 사용하고, 첫 번째 인자로 By.CSS_SELECTOR를 전달하여 CSS 선택자를 사용할 수 있습니다.

이 방식은 Selenium 4에서 요소를 찾기 위한 표준 방식이며, By 클래스를 사용하여 ID, CLASS_NAME, TAG_NAME, LINK_TEXT, PARTIAL_LINK_TEXT, NAME, XPATH 등 다양한 선택자를 사용할 수 있습니다.

 

By.CSS_SELECTOR
By.ID
By.NAME
코드 수정 비교

 

동작이 안되는 코드를 최신 방식으로 변경하고 보니, 몇몇 부분에서는 By.로 데이터를 넘기는 부분이 있었습니다.

처음 개발할 때, 이것저것 섞어서 봤더니 적용하는 방법이 섞여있었습니다. 그러다가 이제서야 제대로 맞췄습니다.

반응형

크롬드라이버 터미널창 생성 문제

이전 버전에서는 크롬드라이버의 터미널창이 생성되지 않았는데, 이번에 버전업한 GUI S/W를 exe로 패키징해서 실행해서보니 갑자기 크롬드라이버의 검은색 터미널창이 생성되면서 동작이 됐습니다. 문제의 원인이 브라우저 headless 설정이 잘못됐나?하고 계속 수정하고 테스트했는데, 결국에는 다른 것을 설정해야했습니다. headless 설정은 정상이었고 터미널창을 숨기기 위해서는 service 옵션을 수정해야했습니다.

 

정리된 가이드는 아래와 같습니다.

크롬 드라이버를 실행할 때 검은색 터미널 창이 보이지 않도록 만들기 위해서는 webdriver.Chromeservice 객체를 생성할 때 Service 클래스의 start_error_message 속성을 활용합니다. 이를 위해 subprocess 모듈의 CREATE_NO_WINDOW 옵션을 사용하여 크롬 드라이버 서비스를 실행하게 할 수 있습니다. 이 방법은 주로 윈도우 시스템에서 사용됩니다.

참고로, 이 방법은 주로 Windows 환경에서 유용하며, macOS나 Linux 환경에서는 동일한 효과를 얻기 위해 다른 접근 방법이 필요할 수 있습니다. macOS나 Linux에서는 일반적으로 터미널 창이 별도로 열리지 않으므로, 이러한 환경에서는 subprocess.CREATE_NO_WINDOW 옵션의 적용이 필요하지 않습니다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import subprocess

# Chrome 옵션을 설정합니다.
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless")  # Headless 모드로 실행

# Chrome 드라이버 서비스를 설정하고, 터미널 창이 보이지 않도록 합니다.
service = Service(executable_path="/path/to/chromedriver",
                  creationflags=subprocess.CREATE_NO_WINDOW)  # 터미널 창 숨기기

# Chrome 드라이버 객체를 생성합니다.
driver = webdriver.Chrome(service=service, options=chrome_options)

# 웹 페이지로 이동합니다.
driver.get("http://www.example.com")

# 페이지의 제목을 출력합니다.
print(driver.title)

# 드라이버를 종료합니다.
driver.quit()
반응형