SW 개발

파이썬크롤링 - selenium click 시에 반응이 없는것에 대한처리

. . . 2021. 12. 2. 13:33
반응형

selenium 으로 크롤링 할때 click 명령어 처리시 이슈가 발생하여 정리한다.

문제증상 및 원인

selenium 으로 특정 element 에 click() 이벤트를 보냈을때 해당 함수에서 return 이 되지 않아 멈춰있는경우가 발생한다.

이러한경우는 timeout 에 대한 처리가 되지 않아 발생한경우로, selenium 에서 지정한 기본 timeout 값이 됐을경우 해당 함수가 풀리리게 된다.

기본적인 해결방법은 click() 을 이용할때 timeout값을 짧게 조정후에, click() 이후에 다시 해당 timeout 값을 복원시켜놓는 방법이 있다.

해결코드

관련하여 간단한 코드를 작성하였다.

  1. click 동작시 set_page_load_timeout() 를 통해서 잠깐 timeout 값을 낮춘다.
  2. element가 click 가능한상황인지 살펴보고
  3. 클릭후에 일정동작을 취한다(키입력등)
  4. 모든 동작이 끝난후에 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)
반응형