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

jangtaesan님의 프로필 이미지

작성한 질문수

[자동화 완전 정복] 인스타그램 휴대폰, 웹 자동화 프로그램 개발

[핵심] 해시태그 검색결과의 "링크"를 전부 추출해서 저장해볼게요

로그인 이후 발이 묶여서 멈추고 더이상 넘어가지 못하고 있습니다.

작성

·

884

1

안녕하세요 : )

강의 넘 잘 듣고 있습니다.

몇일째 넘어가지 못하고 있어 이렇게 글을 남김니다.

로그인 후 환경이 변경된것 같은데

로그인 정보를 저장하시겠어요? 부분은driver.find_element(By.CLASS_NAME, '_acan').click()

이걸로 하니 넘어간 것 같은데

2번째 뜨는 알림 설정 창은

나중에 하기 버튼 클릭을 누르려고 아무리 애를 써도 안되네요 ㅠ

 

driver.find_element(By.CLASS_NAME, '_a9--._a9_1').click()

class="_a9-- _a9_1"

개발자도구 > Ctrl + F

_a9-- _a9_1 이렇게 검색하면 1개를 찾는데

_a9--._a9_1 중간에 빈영역에 .을 넣으면 찾지 못하는 문제가 있네요?

왜일까요?

XPATH, SELECTOR 등을 모두 활용해 봤는데 더 이상 진행이 되지 않습니다.

어떻게 하면 될까요?

답변 3

1

jangtaesan님의 프로필 이미지
jangtaesan
질문자

답변 감사드립니다.

로그인이 완료되고 난 후

처음에 로그인 정보를 저장하는 창이 뜨는데

이 부분은 넘겼다고 생각했는데 오늘 해보니 안되네요.

설명해주신 multi class를 나름 해결한다고 시도를 여럿 해 보았는데 마찬가지 였습니다.

혹시 제가 시도를 안해본 부분이 뭘까요?

# 로그인 정보를 저장하시겠어요? 정보 저장 클릭

# 에러 1>
# Copy selector : #mount_0_0_sU > div > div > div.x9f619.x1n2onr6.x1ja2u2z > div > div > div > div.x78zum5.xdt5ytf.x10cihs4.x1t2pt76.x1n2onr6.x1ja2u2z > div.x9f619.xnz67gz.x78zum5.x168nmei.x13lgxp2.x5pf9jr.xo71vjh.x1uhb9sk.x1plvlek.xryxfnj.x1c4vz4f.x2lah0s.x1q0g3np.xqjyukv.x1qjc9v5.x1oa3qoh.x1qughib > div.xh8yej3.x1gryazu.x10o80wk.x14k21rp.x1porb0y.x17snn68.x6osk4m > section > main > div > div > div > section > div > button
# driver.find_element(By.CSS_SELECTOR, '#mount_0_0_sU > div > div > div.x9f619.x1n2onr6.x1ja2u2z > div > div > div > div.x78zum5.xdt5ytf.x10cihs4.x1t2pt76.x1n2onr6.x1ja2u2z > div.x9f619.xnz67gz.x78zum5.x168nmei.x13lgxp2.x5pf9jr.xo71vjh.x1uhb9sk.x1plvlek.xryxfnj.x1c4vz4f.x2lah0s.x1q0g3np.xqjyukv.x1qjc9v5.x1oa3qoh.x1qughib > div.xh8yej3.x1gryazu.x10o80wk.x14k21rp.x1porb0y.x17snn68.x6osk4m > section > main > div > div > div > section > div > button').click()

# 에러 2>
# XPath : //*[@id="mount_0_0_sU"]/div/div/div[2]/div/div/div/div[1]/div[1]/div[2]/section/main/div/div/div/section/div/button
# driver.find_element(By.XPATH, '//*[@id="mount_0_0_sU"]/div/div/div[2]/div/div/div/div[1]/div[1]/div[2]/section/main/div/div/div/section/div/button').click()

# class="_acan _acap _acas _aj1-"
'''
개발자도구 > Ctrl + F 검색 확인
_acan _acap _acas _aj1-         → 1 of 1
._acan._acap._acas._aj1-        → 1 of 1
._acan                          → 1 of 1
button._acan._acap._acas._aj1-  → 1 of 1
button._acan                    → 1 of 1
'''
# 에러 3>
# driver.find_element(By.CLASS_NAME, 'button._acan._acap._acas._aj1-').click()
# 에러 4>
# driver.find_element(By.CLASS_NAME, '._acan._acap._acas._aj1-').click()
# 에러 5>
# driver.find_element(By.CLASS_NAME, '._acan').click()
# 에러 6>
# driver.find_element(By.CLASS_NAME, 'button._acan').click()

# 에러는 안나지만 넘어가지 않음
# driver.find_element(By.CLASS_NAME, '_acan').click()

# 에러는 안나지만 넘어가지 않음
# btn_later1 = driver.find_element(By.CLASS_NAME, '_acan')
# btn_later1.click()

# 에러는 안나지만 넘어가지 않음
btn_later1 = driver.find_element(By.CLASS_NAME, '_acan')
btn_later1.send_keys(Keys.ENTER)

나중에 하기 클릭은 불가능한지도 확인 부탁드립니다.

이거 하다가 강의 기간 한달이 넘어갈 것 같은 예감이 ㅠㅠ

에러 발생 내용입니다. 혹시나해서...

DevTools listening on ws://127.0.0.1:64499/devtools/browser/3134b8eb-237d-40f7-8c32-7b4f535b308e

Traceback (most recent call last):

File "Q:\Project\Lecture\insta_auto\8.insta_web.py", line 68, in <module>

driver.find_element(By.CLASS_NAME, 'button._acan._acap._acas._aj1-').click()

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "Q:\Project\Lecture\insta_auto\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 831, in find_element

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

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "Q:\Project\Lecture\insta_auto\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 440, in execute

self.error_handler.check_response(response)

File "Q:\Project\Lecture\insta_auto\venv\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 245, in check_response

raise exception_class(message, screen, stacktrace)

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".button._acan._acap._acas._aj1-"}

(Session info: chrome=113.0.5672.94)

Stacktrace:

Backtrace:

GetHandleVerifier [0x00986DF3+48691]

(No symbol) [0x00918CC1]

(No symbol) [0x00825068]

(No symbol) [0x00850477]

(No symbol) [0x008506AB]

(No symbol) [0x0087DD62]

(No symbol) [0x0086A314]

(No symbol) [0x0087C452]

(No symbol) [0x0086A0C6]

(No symbol) [0x00847E18]

(No symbol) [0x00848F3D]

GetHandleVerifier [0x00BE4EAA+2531050]

GetHandleVerifier [0x00C24B60+2792352]

GetHandleVerifier [0x00C1E6EC+2766636]

GetHandleVerifier [0x00A10820+612448]

(No symbol) [0x009225BC]

(No symbol) [0x0091E808]

(No symbol) [0x0091E8EB]

(No symbol) [0x00911C77]

BaseThreadInitThunk [0x75C6FA29+25]

RtlGetAppContainerNamedObjectPath [0x77BD7A7E+286]

RtlGetAppContainerNamedObjectPath [0x77BD7A4E+238]

 

 

김지유님의 프로필 이미지
김지유
지식공유자

driver.find_element(By.CLASS_NAME, 'button._acan._acap._acas._aj1-').click()

이 부분을 아래 코드로 변경해보시지요 !

driver.find_element(By.CSS_SELECTOR, 'button._acan._acap._acas._aj1-').click()
jangtaesan님의 프로필 이미지
jangtaesan
질문자

답변 감사드립니다.

다른 문제가 있는지 결과가 같네요 ㅠ

전체 코드 올려드려볼께요. 혹시 잘못된게 있는지만 짚어주심 감사하겠습니다.

로그인 과정까지는 문제 없이 잘 진행 되었습니다.

import time, data
import chromedriver_autoinstaller
chromedriver_autoinstaller.install()

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()

driver.get("https://www.instagram.com/")


# 인스타그램 로그인 시작
id_selector = "#loginForm > div > div:nth-child(1) > div > label > input"
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, id_selector)))
id_input = driver.find_element(By.CSS_SELECTOR, id_selector)
id_input.send_keys(data.id)

time.sleep(0.5)

pw_selector = "#loginForm > div > div:nth-child(2) > div > label > input"
pw_input = driver.find_element(By.CSS_SELECTOR, pw_selector)
pw_input.send_keys(data.pw)
time.sleep(0.5)

login_btn_selector ="#loginForm > div > div:nth-child(3) > button"
login_btn = driver.find_element(By.CSS_SELECTOR, login_btn_selector)
login_btn.click()
# 인스타그램 로그인 종료

time.sleep(1)


# 로그인 정보를 저장하시겠어요? 정보 저장 클릭
driver.find_element(By.CSS_SELECTOR, 'button._acan._acap._acas._aj1-').click()
time.sleep(1)

# 알림 설정 ("나중에 하기 버튼 클릭")
driver.find_element(By.CLASS_NAME, 'div._a9--._a9_1').click()

input()

 

에러는 역시나 같은 부분에서 납니다. 혹시 저만의 문제일까요?

DevTools listening on ws://127.0.0.1:54628/devtools/browser/9908ddf3-95b0-4a33-8a40-4fae375734ed

Traceback (most recent call last):

File "Q:\Project\Lecture\insta_auto\insta_web_login.py", line 40, in <module>

driver.find_element(By.CSS_SELECTOR, 'button._acan._acap._acas._aj1-').click()

File "Q:\Project\Lecture\insta_auto\venv\Lib\site-packages\selenium\webdriver\remote\webelement.py", line 94, in click

self._execute(Command.CLICK_ELEMENT)

File "Q:\Project\Lecture\insta_auto\venv\Lib\site-packages\selenium\webdriver\remote\webelement.py", line 403, in _execute

return self._parent.execute(command, params)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "Q:\Project\Lecture\insta_auto\venv\Lib\site-packages\selenium\webdriver\remote\webdriver.py", line 440, in execute

self.error_handler.check_response(response)

File "Q:\Project\Lecture\insta_auto\venv\Lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 245, in check_response

raise exception_class(message, screen, stacktrace)

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <button class="_acan acap acas acax aj1-" type="submit" disabled="">...</button> is not clickable at point (662, 310). Other element would receive the click: <div class="x9f619 xjbqb8w x78zum5 x168nmei x13lgxp2 x5pf9jr xo71vjh x1xmf6yo x1e56ztr x540dpk x1m39q7l x1n2onr6 x1plvlek xryxfnj x1c4vz4f x2lah0s xdt5ytf xqjyukv x1qjc9v5 x1oa3qoh x1nhvcw1">...</div>

(Session info: chrome=113.0.5672.94)

 

1

김지유님의 프로필 이미지
김지유
지식공유자

multi class를 찾는 방법은 Tag Name.ClassName1.ClassName2 형태로 사용하는 방법입니다 !

driver.find_element(By.CLASS_NAME, 'div._a9--._a9_1').click() # 이런 식으로 사용하시면 됩니다


 

By.cssSelector("button.btn.btn-xs.btn-custom")

참고 링크 : https://stackoverflow.com/questions/51204668/how-to-find-element-that-has-multiple-class-in-selenium

 

저도 같은 문제인데 혹시 해결하셨나요?

multi class 방식으로 해도 안되는 것 같네요ㅠ

0

저도 같은 문제인데 혹시 해결하셨나요?

multi class 방식으로 해도 안되는 것 같네요ㅠ