×

    Python으로 browser를 제어해 보자.

    python, selenium으로 browser를 제어해 보자.

    anaconda python을 기준으로 설명한다.

    과정

    python으로 browser를 제어하는 과정은 다음과 같다. 자세한 내용은 공식 문서를 참고하자.

    python -> selenium (python package, Selenium Client) - -> webdriver -> browser

    준비

    Webdriver

    selenium은 나중에 설치하도록 하고, 먼저 webdriver를 다운로드 받는다. webdriver는 browser마다 다르며, 여기에서 목록과 주소를 찾을 수 있다.

    Internet Exporer의 경우에는 따로 준비되어 있는데, 32bit를 설치해주는 것이 좋다. 64bit를 설치하면 text가 상당히 느리게 입력되는 문제가 있기 때문이다.

    주의해야 할 점은 이 webdriver들이 windows cmd 환경에서 실행될 수 있도록 %path% 내에 포함되어 있어야 한다는 점이다. 예를 들어 webdriver들을 c:\webdriver 폴더 아래 모아 두었다면, windows 환경변수에서 %path% 내용에 c:\webdriver\를 추가해 주어야 한다. 그렇지 않으면 selenium이 webdriver를 찾을 수 없다는 메시지를 내보낸다. %path% 설정에 대해서는 여기에 자세히 설명되어 있다.

    Selenium & anaconda env

    이제 selenium을 설치하면 된다. 사실 설치는 pip install selenium하면 간단히 설치된다. 그런데, anaconda python을 설치한 경우에는 windows cmd 환경에서 python을 찾을 수 없다고 나오기 때문에 문제가 된다. anaconda python을 이용하는 경우에는 selenium 설치 전에 anaconda python env를 만들어주는 작업이 추가로 필요하다.

    anaconda prompt에서 python 3.6을 이용하는 myenv라는 이름의 새로운 env를 추가해보자.

    # open "anaconda prompt"
    # create conda environment
    conda create -n myenv python=3.6
    conda env list
    

    아래와 같이 env 환경을 활성화시킨 다음 설치해 준다. (env 환경 밖에서 package를 설치할 경우에는 conda install -n myenv packagename로 env 환경 내에 package를 설치할 수 있다.)

    # activate env
    activate myenv
    
    # install selenium for controling browser
    conda install selenium
    # or pip install selenium
    

    Tip : 회사 같은 경우 사내 ssl이 있다면 pip로 package 설치가 용이하지 않다. 이런 경우에는 --trusted-host pypi.org --trusted-host files.pythonhosted.org option을 달아 준다. 여기

    python script 작성

    이제 python으로 script를 작성해서 실행시키면 된다.

    Case by Case

    javascript를 실행시켜야 할 때

    페이지에 따라 버튼이나 링크를 누르면 해당 페이지에 구현된 javascript 함수가 호출되는 경우가 있다. 이런 경우에는 버튼이나 링크를 누르는 것 보다 해당 javascript 함수를 직접 호출하는 것이 더 편리할 수 있다. 물론 해당 javascript 함수를 알아 내야 하지만 말이다.

    selenium에서는 아래와 같이 javascript를 호출할 수 있다.

    # pop alert up
    browser.execute_script("javascript:confirm('OK?');")
    

    예상치 못한 alert 창이 뜰 수 있을 때

    어떤 액션을 취한 뒤에 alert 창이 뜨는 경우가 많다. 이런 경우에는 이 alert를 체크 해주어야 다음 액션을 취할 수 있다. 다음과 같은 함수를 만들어두고 alert 창이 뜰 수 있는 곳에 넣어 두면 문제를 해결할 수 있다.

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    def beyondAlert( browser, delay ):
     try:
      WebDriverWait( browser, delay ).until( EC.alert_is_present(), 'Waiting for alert timed out' )
      alert = browser.switch_to_alert()
      alert.accept()
      print("alert accepted")
      state = 1
     except TimeoutException:
      print("no alert")
      state = 0
    
     browser.switch_to_default_content()
     return state
    

    button click이 되지 않을 때

    마우스로 button을 클릭하면 액션이 나타나는데, selenium으로 하면 액션이 나타나지 않는 경우가 있다. button을 mouse-over해야 활성화되는 element를 심어 놓은 경우이다. 왜 이런 방식으로 페이지를 만들었는지는 모르겠지만, 이런 경우에는 아래 코드가 작동하지 않는다.

    # browser = webdriver.Chrome(  )
    # btn = browser.find_element_by_css_selector( "#targetButton" )
    btn.click()
    

    이 문제를 해결하려면, 손으로 움직이는 것처럼 button에 mouse-over한 상태에서 button을 click을 해 주어야 한다. selenium에서 이러한 동작을 수행하려면 action chain을 이용하여 이런 action들을 묶어준 뒤 한 번에 동작시키면 된다.

    from selenium.webdriver.common.action_chains import ActionChains
    # browser = webdriver.Chrome(  )
    # btn = browser.find_element_by_css_selector( "#targetButton" )
    actions = ActionChains( browser ).move_to_element( btn ).pause(1).click( btn )
    actions.perform()
    
    ... ... ... ...
    Back