반응형
selenium 으로 크롤링 할때 click 명령어 처리시 이슈가 발생하여 정리한다.
문제증상 및 원인
selenium 으로 특정 element 에 click() 이벤트를 보냈을때 해당 함수에서 return 이 되지 않아 멈춰있는경우가 발생한다.
이러한경우는 timeout 에 대한 처리가 되지 않아 발생한경우로, selenium 에서 지정한 기본 timeout 값이 됐을경우 해당 함수가 풀리리게 된다.
기본적인 해결방법은 click()
을 이용할때 timeout값을 짧게 조정후에, click()
이후에 다시 해당 timeout 값을 복원시켜놓는 방법이 있다.
해결코드
관련하여 간단한 코드를 작성하였다.
- click 동작시
set_page_load_timeout()
를 통해서 잠깐 timeout 값을 낮춘다. - element가 click 가능한상황인지 살펴보고
- 클릭후에 일정동작을 취한다(키입력등)
- 모든 동작이 끝난후에
set_page_load_timeout()
을 통해 원래 timeout 값으로 반환
def element_id_click(webdriver, element_id, send_key=None, send_key_interval=1, load_page_timeout = DEFAULT_CLICK_TIME_OUT_SEC) :
try :
web_driver.set_page_load_timeout(load_page_timeout)
test_condition = expected_conditions.element_to_be_clickable((By.ID, element_id))
assert test_condition is not None
web_driver.find_element_by_id(element_id).click()
print('try to click :: okay {element_id}'.format(element_id=element_id))
if send_key is not None :
print('try to click :: send key... {element_id}'.format(element_id=element_id))
web_driver.implicitly_wait(send_key_interval)
web_driver.find_element_by_id(element_id).send_keys(send_key)
return True
except NoSuchElementException :
raise NoSuchElementException
except Exception as e:
print('try to click err :: {e} :: {element_id}'.format(e=e, element_id=element_id))
return False
finally:
web_driver.set_page_load_timeout(DEFAULT_LOAD_TIME_OUT_SEC)
반응형