Selenium에서 Chrome 115버전 에러 해결?

이번 주는 새싹(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)

이렇게 쓰면 이제 굳이 별도의 라이브러리를 사용하지 않아도 쉽게 크롬드라이버를 실행할 수 있다.


가르치는 것이 결국 배우는 것이라고 하지만, 그 얘기는 왠지 이런 경우를 두고 하는 얘기는 아닐 것 같다.

그럼에도 레거시에 멈춰있을 수도 있는 지식이, 계속 업데이트 되는 것은 꽤나 배움이고 즐겁다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다