Post

파이썬 + 셀레니움 테스트 오류

pip 명령어를 사용해서 셀레니움에 파이썬 라이브러리를 설치했고, 다음 단계인 셀레니움을 이용한 테스트를 실행하였는데 문제가 발생하였다..

1
python first_test.py

윈도우 cmd창에 위와 같은 명령어를 입력하였더니 강의와는 다르게 Python만 출력되고 테스트코드가 실행되지 않았다.

이것 저것 뭐가 문젠지 확인해보다가 셀레니움 화면에 우분투 마크인 펭귄 모양이 보였고, 펭귄에 마우스를 호버해보니 다음과 같은 코드가 보여졌다.

1
2
3
4
5
6
7
8
{
  "browserName": "chrome",
  "browserVersion": "123.0",
  "goog:chromeOptions": { "binary": "/usr/bin/google-chrome" },
  "platformName": "linux",
  "se:noVncPort": 7900,
  "se:vncEnabled": true
}

메세지 중에 platformNamelinux로 설정되어 있는 것을 보고, linux환경에서 명령어를 실행시켜야하는 것 같아 window 우분투에서 해당 명령어를 입력해보았다.

1
2
3
4
5
python first_test.py

Command 'python' not found, did you mean:
  command 'python3' from deb python3
  command 'python' from deb python-is-python3

나는 윈도우 환경에 파이썬을 설치했기 때문에 우분투 즉, 리눅스 환경에서는 파이썬이 설치되어있지않아서 파이썬 명령을 수행할 수가 없었다.

또한 파이썬 버전을 확인하기 위해 vs code 터미널에

1
python

을 입력했더니, microsoft store에서 python을 검색한 결과 창이 오픈되었다.

혹시나 하는 마음에 vs code 터미널이 아닌 윈도우의 cmd 창에 해당 명령어를 입력하였더니 실행이 되다가 오류가 발생했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
python first_test.py

Test Execution Started
Traceback (most recent call last):
  File "C:\Users\user\Desktop\스프린트4\5-01\5-01\first_test.py", line 10, in <module>
    driver = webdriver.Remote(
             ^^^^^^^^^^^^^^^^^
  File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 208, in __init__
    self.start_session(capabilities)
  File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 292, in start_session
    response = self.execute(Command.NEW_SESSION, caps)["value"]
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 347, in execute
    self.error_handler.check_response(response)
  File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 229, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.SessionNotCreatedException: Message: Could not start a new session. Error while creating session with the driver service. Stopping driver service: Could not start a new session. Response code 500. Message: session not created: DevToolsActivePort file doesn't exist
Host info: host: 'dec356bcf759', ip: '172.17.0.3'
Build info: version: '4.19.0', revision: '5f9cec8963'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '5.15.146.1-microsoft-standard-WSL2', java.version: '17.0.10'
Driver info: driver.version: unknown
Build info: version: '4.19.0', revision: '5f9cec8963'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '5.15.146.1-microsoft-standard-WSL2', java.version: '17.0.10'
Driver info: driver.version: unknown
Stacktrace:
    at org.openqa.selenium.grid.node.config.DriverServiceSessionFactory.apply (DriverServiceSessionFactory.java:221)
    at org.openqa.selenium.grid.node.config.DriverServiceSessionFactory.apply (DriverServiceSessionFactory.java:71)
    at org.openqa.selenium.grid.node.local.SessionSlot.apply (SessionSlot.java:147)
    at org.openqa.selenium.grid.node.local.LocalNode.newSession (LocalNode.java:464)
    at org.openqa.selenium.grid.distributor.local.LocalDistributor.startSession (LocalDistributor.java:651)
    at org.openqa.selenium.grid.distributor.local.LocalDistributor.newSession (LocalDistributor.java:570)
    at org.openqa.selenium.grid.distributor.local.LocalDistributor$NewSessionRunnable.handleNewSessionRequest (LocalDistributor.java:830)
    at org.openqa.selenium.grid.distributor.local.LocalDistributor$NewSessionRunnable.lambda$run$1 (LocalDistributor.java:790)
    at java.util.concurrent.ThreadPoolExecutor.runWorker (None:-1)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run (None:-1)
    at java.lang.Thread.run (None:-1)

webdriver에 연결할 수 없다는 오류 같아서 chromedriver를 구글에 검색해보니 크롬 웹 드라이버 설치 관련 포스트가 있었다. Chrome Web Driver 최신 버전 설치 방법 119.** , 120.**에서 알려준대로

먼저, 크롬이 최신버전이 아니라, 최신 버전으로 업데이트 해주었다.

크롬 업데이트 크롬 업데이트 완료

그리고 크롬 웹 드라이버 사이트에서 들어가보니

Current Releases If you are using Chrome version 115 or newer, please consult the Chrome for Testing availability dashboard. This page provides convenient JSON endpoints for specific ChromeDriver version downloading.

크롬 115버전 이상을 사용할 경우에 테스트용 Chrome for Testing availability dashboard에서 참조하라고 적혀있었다.

들어가보니 나는 stable버전인 123 버전을 사용하고 있기 때문에 윈도우64 123버전 https://storage.googleapis.com/chrome-for-testing-public/123.0.6312.86/win64/chromedriver-win64.zip를 url 주소 창에 입력해 다운받고 설치까지 했다.

1
2
3
4
Starting ChromeDriver 123.0.6312.86 (9b72c47a053648d405376c5cf07999ed626728da-refs/branch-heads/6312@{#698}) on port 9515
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

그리고 다시 python을 사용해 테스트 코드를 실행시켰다. 또 다른 오류를 만났다…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
python first_test.py

Test Execution Started
Traceback (most recent call last):
  File "C:\Users\user\Desktop\스프린트4\5-01\5-01\first_test.py", line 24, in <module>
    driver.find_element("link text", "무료로 시작하기").click()
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 741, in find_element
    return self.execute(Command.FIND_ELEMENT, {"using": by, "value": value})["value"]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 347, in execute
    self.error_handler.check_response(response)
  File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 229, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"link text","selector":"무료로 시작하기"}
  (Session info: chrome=123.0.6312.86); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Stacktrace:
#0 0x5589b09bf8a3 <unknown>
#1 0x5589b06b58c6 <unknown>
#2 0x5589b0700618 <unknown>
#3 0x5589b07006d1 <unknown>
#4 0x5589b0743744 <unknown>
#5 0x5589b07225cd <unknown>
#6 0x5589b0740c19 <unknown>
#7 0x5589b0722343 <unknown>
#8 0x5589b06f3593 <unknown>
#9 0x5589b06f3f5e <unknown>
#10 0x5589b098388b <unknown>
#11 0x5589b09877e5 <unknown>
#12 0x5589b09715b1 <unknown>
#13 0x5589b0988372 <unknown>
#14 0x5589b09568bf <unknown>
#15 0x5589b09ae768 <unknown>
#16 0x5589b09ae93b <unknown>
#17 0x5589b09be9f4 <unknown>
#18 0x7f99879cfac3 <unknown>

NoSuchElementException 오류는 WebDriver가 웹 페이지에서 해당 요소를 찾을 수 없을 때 발생한다고 한다.

나의 경우는 “무료로 시작하기”라는 링크 텍스트를 찾지 못해 발생하고 있었다.

chatGPT에 물어보니, 종종 웹 페이지가 완전히 로드되기 전에 요소를 찾으려고 시도하기 때문에 오류가 발생할 수 있다고 한다. 그래서 WebDriverWait를 사용하여 요소가 나타날 때까지 대기하는 코드를 추가해주었다.

1
2
3
4
5
6
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import time

# ...테스트코드들

세션 접속 성공

그리고 localhost:4444의 세션페이지에서 기다렸더니 해당 테스트가 로드되었고 카메라 버튼을 눌러 비밀번호를 입력해주었더니…

예시 서버 오류

예시 사이트https://notes.prgms-fullcycle.com가 502 서버 오류를 내뱉고 있어서 발생한 오류였다…

502 서버 오류

셀레니움 테스트를 종료하고 싶었지만… ctrl + c로 파이썬 명령을 종료하는 것도, driver close()명령도 모두 먹지않아 컴퓨터를 종료하고 다시 킨 다음에 first_test.py 코드를 내 블로그에 맞춰서 수정을 해주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from selenium import webdriver
import time

print("Test Execution Started")

options = webdriver.ChromeOptions()
options.add_argument('--ignore-ssl-errors=yes')
options.add_argument('--ignore-certificate-errors')

driver = webdriver.Remote(
    command_executor='http://localhost:4444/wd/hub',
    options=options
)

# maximize the window size
driver.maximize_window()
time.sleep(10)

# navigate to the notes app
driver.get("https://hyemin12.github.io/")
time.sleep(10)

# click on the Get started for free button
driver.find_element("link text", "CATEGORIES").click()
time.sleep(10)

# close the browser
s = input("Done: ")

driver.close()
driver.quit()

print("Test Execution Successfully Completed!")


그리고 다시 python first_test.py 명령어를 실행시키고 localhost:4444 접속해서 다시 확인해보니, 정상적으로 실행되고 있었다.

셀레니움 테스트

정상적으로 실행되니, 종료도 정상적으로 되었다.

셀레니움 테스트_창

This post is licensed under CC BY 4.0 by the author.