이번 주는 새싹(SeSAC)이라고 부르는 청년취업사관학교에서 강의를 하고 있다. 프로그래밍 언어와 관련된 강의를 하면 당연히 외부 라이브러리를 사용하게 된다. 물론 언어 기초 수업에서는 최대한 안 쓰고 로직 실습을 많이 하지만, 그렇지 않은 대부분의 경우는 라이브러리를 사용한다.
덕분에 강의를 진행하면서 라이브러리의 변천사를 몸소 겪게 된다. deprecated 함수들도 빠르게 파악할 수 있고, 사용법이 바뀌는 경우도 바로 따라갈 수 있다.
이번 강의에서는 Selenium 라이브러리를 사용하고 있는데, Selenium도 많은 변천사가 있었다. 업무 자동화 강의를 처음 시작할 때부터 썼었는데, 벌써 7년도 넘었다.
그 당시에 쓰던 find_element_by_id와 같은 함수는 find_element로 통합되고, find_element_by_id가 deprecated 될 거라며 워닝 메시지를 보면서 강의하다, 현재는 아예 쓸 수가 없게 된 걸 보면 긴 시간 동안 변천사를 지켜본 셈이다.
마침 오늘, Selenium 라이브러리를 설치해서 쓰는데, 최근 몇 년 동안은 webdriver-manager 라이브러리와 함께 사용하면서 크롬드라이버를 쉽게 관리했었다.
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager service = Service(ChromeDriverManager().install()) d = webdriver.Chrome(service=service)
이렇게 ChromeDriverManager를 사용하여 로컬에 설치되어 있는 크롬 버전에 맞춰서 자동으로 크롬드라이버를 다운로드 해주고 경로를 반환해 주었다. 덕분에 편하게 크롬드라이버를 관리할 수 있었다.
그런데, Chrome 버전이 115로 올라오면서 Chrome for Testing을 사용하라는 안내가 나왔다.
https://chromedriver.chromium.org/downloads로 접속해서 확인할 수 있다.
심지어 현재 글을 쓰고 있는 시간에 크롬 최신 안정화 버전이 115.0.5790.114인데, 해당 버전의 크롬드라이버는 존재하지 않는다.
아마 이런 이유로 인해, webdriver_manager로 설치를 사용해서 크롬 드라이버를 띄우려고 하면 에러가 발생한다.
$ python test.py Traceback (most recent call last): File "/Users/taehwalee/Downloads/test.py", line 6, in <module> d = webdriver.Chrome(service=service) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/taehwalee/Downloads/venv/lib/python3.11/site-packages/selenium/webdriver/chrome/webdriver.py", line 45, in __init__ super().__init__( File "/Users/taehwalee/Downloads/venv/lib/python3.11/site-packages/selenium/webdriver/chromium/webdriver.py", line 56, in __init__ super().__init__( File "/Users/taehwalee/Downloads/venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 206, in __init__ self.start_session(capabilities) File "/Users/taehwalee/Downloads/venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 290, in start_session response = self.execute(Command.NEW_SESSION, caps)["value"] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/taehwalee/Downloads/venv/lib/python3.11/site-packages/selenium/webdriver/remote/webdriver.py", line 345, in execute self.error_handler.check_response(response) File "/Users/taehwalee/Downloads/venv/lib/python3.11/site-packages/selenium/webdriver/remote/errorhandler.py", line 229, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary Stacktrace: 0 chromedriver 0x00000001050c3a58 chromedriver + 4991576 1 chromedriver 0x00000001050bafa3 chromedriver + 4956067 2 chromedriver 0x0000000104c6d607 chromedriver + 443911 3 chromedriver 0x0000000104c9b4b7 chromedriver + 631991 4 chromedriver 0x0000000104c9a64c chromedriver + 628300 5 chromedriver 0x0000000104ce324c chromedriver + 926284 6 chromedriver 0x0000000104ce25af chromedriver + 923055 7 chromedriver 0x0000000104cd9633 chromedriver + 886323 8 chromedriver 0x0000000104ca56f9 chromedriver + 673529 9 chromedriver 0x0000000104ca68de chromedriver + 678110 10 chromedriver 0x000000010507f8a9 chromedriver + 4712617 11 chromedriver 0x00000001050848b4 chromedriver + 4733108 12 chromedriver 0x000000010508b799 chromedriver + 4761497 13 chromedriver 0x000000010508560a chromedriver + 4736522 14 chromedriver 0x000000010505887c chromedriver + 4552828 15 chromedriver 0x00000001050a3c08 chromedriver + 4860936 16 chromedriver 0x00000001050a3d87 chromedriver + 4861319 17 chromedriver 0x00000001050b3edf chromedriver + 4927199 18 libsystem_pthread.dylib 0x00007ff818dab1d3 _pthread_start + 125 19 libsystem_pthread.dylib 0x00007ff818da6bd3 thread_start + 15
바로 cannot find Chrome binary 에러이다. 에러 메시지에서 알 수 있듯이 chromedriver를 찾을 수 없다는 에러인데, 실제로 ChromeDriverManager().install()가 반환하는 경로를 가보면 다운로드는 되어있는 것을 알 수 있다.
결국 여러 조사를 하고 Selenium과 webdriver-manager 라이브러리의 패치 노트도 뒤지다가 발견했다.
Selenium이 4.11.0, 4.11.1, 4.11.2 버전이 어제(2023/08/01)에 업데이트되었는데, 여기에서 Chrome for Testing을 지원하기로 했고 이를 Selenium에 내장된 드라이버 매니저를 통해서 지원한다는 것을 확인했다.
(Entering Chrome for Testing이라고..)
https://www.selenium.dev/blog/2023/whats-new-in-selenium-manager-with-selenium-4.11.0/
뭐, 그래서 해결은 깔끔하다. 더 이상 webdriver-manager가 필요 없게 되었다.
from selenium import webdriver from selenium.webdriver.chrome.service import Service service = Service() d = webdriver.Chrome(service=service)
이렇게 쓰면 이제 굳이 별도의 라이브러리를 사용하지 않아도 쉽게 크롬드라이버를 실행할 수 있다.
가르치는 것이 결국 배우는 것이라고 하지만, 그 얘기는 왠지 이런 경우를 두고 하는 얘기는 아닐 것 같다.
그럼에도 레거시에 멈춰있을 수도 있는 지식이, 계속 업데이트 되는 것은 꽤나 배움이고 즐겁다.