2023-06-08 TIL

0v0baek·2023년 6월 8일
0

TIL

목록 보기
69/92

[selenium] 더보기 클릭 자동화

TypeError: argument of type 'NoneType' is not iterable

셀레니움으로 해당 페이지의 퀴즈 더보기를
html이 더이상 추가되지 않을 때 까지 클릭하게 하려고 한다.

🚫 문제 발생 코드

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
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.common.exceptions import TimeoutException


# chromedriver 실행 파일의 경로
chromedriver_path = "F/nbc/chromedriver_win32/chromedriver"

# Service 객체 생성
service = Service(chromedriver_path)

# Chrome 드라이버 생성 및 서비스 설정
driver = webdriver.Chrome(service=service)
driver.implicitly_wait(3)
driver.get(
    "https://wquiz.dict.naver.com/list.dict?service=krdic&dictType=koko&sort_type=3&group_id=1"
)
# 기다리는 객체 생성
wait = WebDriverWait(driver, 10)

while True:
    try:
        open_btn = driver.find_element(By.ID, "btn_quiz_more")
        open_btn.click()
        wait.until(
            EC.text_to_be_present_in_element_value(
                (By.ID, "btn_quiz_more"), "퀴즈 더보기 1746 / 1746"
            )
        )
    except TimeoutException:
        break

내 생각으론, 클릭한 뒤 element_value"퀴즈 더보기 1746 / 1746"이 될 떄 까지 클릭하게 하고,
wait 객체에서 TimeoutException이 발생하면
클릭을 멈추고 break를 하도록 하는 거였다.

근데 제대로 실행이 안되고 한 번 클릭 후 종료된다...

✅ 해결 한 방법

생각해보니까 TimeoutExceptionwait의 조건을 충족하지 못해야 꺼지기 때문에 접근 방식부터 잘못됐다.

대신 간단하게, if문을 써서 걸러주었다!

"""
윗 부분 코드는 동일
"""

while True:
    open_btn = driver.find_element(By.ID, "btn_quiz_more")
    if open_btn.text == "퀴즈 더보기 1746 / 1,746":
        break
    open_btn.click()

open_btn.textprint해보면 이렇게 나온다.

그렇기 때문에, 마지막 지점에 도달하면
open_btn.text퀴즈 더보기 1746 / 1,746이 되니까
이 때 break를 해주면 알아서 꺼진다!!

문제 해결.

profile
개발 공부 하는 비전공자 새내기. 꾸준히 합시다!

0개의 댓글