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
를 하도록 하는 거였다.
근데 제대로 실행이 안되고 한 번 클릭 후 종료된다...
생각해보니까 TimeoutException
은 wait
의 조건을 충족하지 못해야 꺼지기 때문에 접근 방식부터 잘못됐다.
대신 간단하게, 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.text
를 print
해보면 이렇게 나온다.
그렇기 때문에, 마지막 지점에 도달하면
open_btn.text
가 퀴즈 더보기 1746 / 1,746
이 되니까
이 때 break를 해주면 알아서 꺼진다!!
문제 해결.