인프런 커뮤니티 질문&답변

송내님의 프로필 이미지
송내

작성한 질문수

[2024 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)

네이버 메일 자동화 - 01. 새로운 창 제어 하는 법

NoSuchElementException 에러 해결은 되었는데, 정확한 원인은 ㅠㅠ

작성

·

395

·

수정됨

0

#드롭다운 메뉴 클릭
driver.find_element(By.CSS_SELECTOR,"#account > div.MyView-module__my_menu___eF24q.MyView-module__is_open____qWM1 > div > div > ul > li:nth-child(1) > a > span.MyView-module__item_text___VTQQM").click()   

CSS selector 제대로 한것 같은데 실행하면 하기와 같이 에러 발생합니다. 도움 부탁드립니다.


---------------------------------------------------------------------------

NoSuchElementException Traceback (most recent call last)

Cell In[5], line 1

----> 1 driver.find_element(By.CSS_SELECTOR,\"#account > div.MyView-module__my_menu___eF24q.MyView-module__is_open____qWM1 > div > div > ul > li:nth-child(1) > a > span.MyView-module__item_text___VTQQM\").click()

File c:\\Users\\visio\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py:741, in WebDriver.find_element(self, by, value)

738 by = By.CSS_SELECTOR

739 value = f'[name=\"{value}\"]'

--> 741 return self.execute(Command.FIND_ELEMENT, {\"using\": by, \"value\": value})[\"value\"]

File c:\\Users\\visio\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\selenium\\webdriver\\remote\\webdriver.py:347, in WebDriver.execute(self, driver_command, params)

345 response = self.command_executor.execute(driver_command, params)

346 if response:

--> 347 self.error_handler.check_response(response)

348 response[\"value\"] = self._unwrap_value(response.get(\"value\", None))

349 return response

File c:\\Users\\visio\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\selenium\\webdriver\\remote\\errorhandler.py:229, in ErrorHandler.check_response(self, response)

227 alert_text = value[\"alert\"].get(\"text\")

228 raise exception_class(message, screen, stacktrace, alert_text) # type: ignore[call-arg] # mypy is not smart enough here

--> 229 raise exception_class(message, screen, stacktrace)

NoSuchElementException: Message: no such element: Unable to locate element: {\"method\":\"css selector\",\"selector\":\"#account > div.MyView-module__my_menu___eF24q.MyView-module__is_open____qWM1 > div > div > ul > li:nth-child(1) > a > span.MyView-module__item_text___VTQQM\"}

(Session info: chrome=125.0.6422.176); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception

Stacktrace:

\tGetHandleVerifier [0x00007FF7C22C1F52+60322]

\t(No symbol) [0x00007FF7C223CEC9]

\t(No symbol) [0x00007FF7C20F7EBA]

\t(No symbol) [0x00007FF7C2147676]

\t(No symbol) [0x00007FF7C214773C]

\t(No symbol) [0x00007FF7C218E967]

\t(No symbol) [0x00007FF7C216C25F]

\t(No symbol) [0x00007FF7C218BC80]

\t(No symbol) [0x00007FF7C216BFC3]

\t(No symbol) [0x00007FF7C2139617]

\t(No symbol) [0x00007FF7C213A211]

\tGetHandleVerifier [0x00007FF7C25D94AD+3301629]

\tGetHandleVerifier [0x00007FF7C26236D3+3605283]

\tGetHandleVerifier [0x00007FF7C2619450+3563680]

\tGetHandleVerifier [0x00007FF7C2374326+790390]

\t(No symbol) [0x00007FF7C224750F]

\t(No symbol) [0x00007FF7C2243404]

\t(No symbol) [0x00007FF7C2243592]

\t(No symbol) [0x00007FF7C2232F9F]

\tBaseThreadInitThunk [0x00007FF81527257D+29]

\tRtlUserThreadStart [0x00007FF8161EAF28+40]

"

 

답변 3

0

송내님의 프로필 이미지
송내
질문자

몇번을 시도 해서 안되고, vs code 와 pylance restart해봐도 안되고, 다른 pc에서 파일을 옮겨서 해도 안되었습니다.
그런데른 단축한 선택자(li:nth-child(1) > a > span.MyView-module__item_text___VTQQM)로 하니까 되었습니다. 그런데, 혹시나 해서 다시 copy selector 한 full 선택자로 해보니까 이번에는 작동합니다. 에러는 사라졌는데, 정확하게 뭐때문에 에러 발생했는지는 모르고 넘어갑니다.

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

흠... 아마도 로그인 버튼 클릭한 뒤, 바로 메뉴를 클릭해서 발생했던 문제일겁니다.

페이지가 로딩 되기 전에 태그를 찾을려고 하면 자주 발생하는 오류에요 🙂

0

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

코드 전체를 알려주시면 정확한 답변이 가능합니다~

송내님의 프로필 이미지
송내
질문자

user_id="********"
user_pw="********"
#셀레니움 기본 템플릿
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import pyperclip
 

#크롬 드라이브 생성
driver=webdriver.Chrome()
 
# 페이지 이동
driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/")
time.sleep(1)

# # 아이디  입력(NameError: name 'user_id' is not defined 발생)
# id=driver.find_element(By.CSS_SELECTOR,'#id')
# id.send_keys(user_id)
# time.sleep(1)

# 아이디  입력
# (NameError: name 'user_id' is not defined 발생)=> 붙여넣기방법으로 진행
id=driver.find_element(By.CSS_SELECTOR,'#id')
pyperclip.copy(user_id)
id.send_keys(Keys.CONTROL,'v') # 붙여넣기 방법
time.sleep(1)

#비밀번호 입력 (send.keys로 입력하면 문제가 되므로 복사 붙여넣기로 해야됨)
pw=driver.find_element(By.CSS_SELECTOR,"#pw")
pyperclip.copy(user_pw)
pw.send_keys(Keys.CONTROL,'v')
time.sleep(1)

#로그인 버튼 클릭
driver.find_element(By.CSS_SELECTOR,"#log\\.login").click()
#드롭다운 메뉴 클릭
driver.find_element(By.CSS_SELECTOR,"#account >

안녕하세요. 전체 코드입니다.

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

아이디와 비밀번호 가리셔야해요!

0

안녕하세요, 인프런 AI 인턴입니다.

송내님의 질문은 NoSuchElementException 에러에 대한 해결 방법을 찾고 계신 것으로 이해됩니다. 송내님께서 제공해주신 코드와 에러 메시지를 바탕으로 해당 문제의 원인과 해결책에 대해 살펴보았습니다.

NoSuchElementException는 지정한 선택자에 해당하는 웹 요소를 찾지 못할 때 발생하는 에러입니다. 이 에러의 가장 흔한 원인은 다음과 같습니다.

  1. 웹 페이지가 완전히 로드되기 전에 요소를 찾으려고 시도했을 때: 이 경우, Selenium에게 웹 페이지나 특정 요소가 완전히 로드될 때까지 기다리도록 명령해야 합니다.
  2. CSS 선택자가 잘못되었거나 페이지 구조가 변경되어 선택자가 더 이상 유효하지 않을 때: 페이지의 HTML 구조를 다시 확인하고, 필요하다면 선택자를 업데이트해야 합니다.

해당 문제의 해결 방안으로는 여러 접근 방법이 있을 수 있으나, 유사한 경우에 대해 이야기한 다음 토론을 참고하시면 도움이 될 수 있습니다.

  • NoSuchElementException에 대해 해결 방법을 논의한 질문: “NoSuchElementException Stacktrace 에러입니다.”에서는 CSS 선택자로 웹 요소를 찾는 경우에서 발생할 수 있는 문제와 그 해결책에 대해 설명하고 있습니다. 특히, 다른 선택자를 찾아보라는 조언이 유용할 수 있습니다.

  • 또 다른 질문 “NoSuchElementException 이라고 뜹니다”에서는 큰 이미지를 다운로드하는 과정에서 같은 에러가 발생하는 경우를 다루며, CSS 선택자나 코드 실행 타이밍 문제와 관련된 해결책을 제시합니다.

이러한 정보를 바탕으로, 페이지가 완전히 로드됨을 확인하고 CSS 선택자가 여전히 유효한지 검토해보시기 바랍니다. 또한, WebDriverWait을 사용하여 특정 요소가 로드될 때까지 명시적으로 기다리는 코드를 추가하는 것도 좋은 접근 방법입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

송내님의 프로필 이미지
송내

작성한 질문수

질문하기