[컴][웹] Selenium, web browser 자동화

셀레니엄 / 웹 브라우저 자동화



Selenium Web driver

test 등을 위한 browser automation 을 제공하는 web automation framework 이다.(적어도 이들은 이렇게 부른다.)[ref. 1]

지원하는 언어는 아래와 같다.
  • Java
  • .Net
  • PHP
  • Python
  • Perl
  • Ruby
이 Selenium Web driver 이전에 나왔던 것이 Selenium RC 이다. 구조도 다르다. 자세한 것은 ref. 1 을 참고하자.



개인적으로 처음에는 Selenium IDE 를 쓰려고 했는데, 조금 하다 보니 programming 하기에는 적합하지 않았다. 정말 간단한 macro 용도나 개발용으로 쓸만한 듯 하다.



Selenium local script 와 server

local web driver script 와 server 에 대한 정리는 아래 link 를 참고하자.


버전 문제, crash

firefox 의 최신버전에서 동작하지 않을 수도 있다. old version 을 download 하자. 어떤 버전을 지원하는지에 대한 정보는 change log 에서 얻을 수 있다.

참고로,  2016-03-15 release 한 2.53.0  버전에서는 firefox 46.01 까지는 잘 동작한다. 그런데 firefox 47 에서 appcrash 가 발생한다.

old version 을 설치후 사용방법

ref.2 에 나와있는대로 firefox 의 path 를 지정해 주면 된다.




Web Driver Tip



화면에 element 가 보이지 않는 경우

때로는 화면에 element 가 보이지 않는 경우
  • WebDriverWait(webdriver, time).until(EC.presence_of_element_located((by, element)))
  • WebDriverWait(webdriver, time).until(EC.element_to_be_clickable((by, element)))
에서 error 가 발생하기도 한다. 이 경우는 execute_script 를 사용하는 등으로 해결할 수 있다.
driver.execute_script("arguments[0].click();", el)



예제

input 에 값 넣고, button click 하는 예제

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait  # available since 2.4.0
# available since 2.26.0
from selenium.webdriver.support import expected_conditions as EC


driver = webdriver.Firefox()

driver.get('http://daum.net')
WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.ID, 'login_id')))


loginInputXpath = "//input[@id='login']"
driver.find_element_by_xpath(loginInputXpath).clear()
driver.find_element_by_xpath(loginInputXpath).send_keys('myid')

loginButtonXpath = "//input[@type='submit']"
driver.find_element_by_xpath(loginButtonXpath).click()


WebDriver 의 User Agent 변경하기


# FireFox
from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_preference("general.useragent.override", "whatever you want")
driver = webdriver.Firefox(profile)

# Chrome
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.add_argument("user-agent=whatever you want")

driver = webdriver.Chrome(chrome_options=opts)

# PhantomJS
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
...
caps = DesiredCapabilities.PHANTOMJS
caps["phantomjs.page.settings.userAgent"] = "whatever you want"
driver = webdriver.PhantomJS(desired_capabilities=caps)


file dialog 처리




code snippets

acceptAlert

alert 이 안나오면 skip 하고, alert 이 나오면 처리해 준다.
def acceptAlert(driver):
    alertShowed = False
    try:
        WebDriverWait(driver, 3).until(EC.alert_is_present(),
                                       'Timed out waiting for PA creation ' +
                                       'confirmation popup to appear.')

        alert = driver.switch_to_alert()
        alert.accept()
        print "+Warning : alert accepted"
        alertShowed = True
    except TimeoutException:
        print "no alert"

    return alertShowed

iframe decorator

iframe 인 경우 context 를 왔다갔다 하는데, 그것을 좀 편하게 하기 위한 decorator
################################
#
#  Decorators
#
################################
from selenium.webdriver.support import expected_conditions as EC

def waitEl(webdriver, by, element, time):
    return WebDriverWait(webdriver, time).until(EC.presence_of_element_located((by, element)))

def iframe(xpath):
    def dec(func):
        def dec_dec(self, *args, **kwargs):
            driver = self.driver

            # select the iframe
            waitEl(driver, By.XPATH, xpath, 3)
            driver.switch_to.frame(
                frame_reference=driver.find_element_by_xpath(xpath))

            func(self, *args, **kwargs)

            # back to the first frame
            driver.switch_to.default_content()

            return

        return dec_dec

    return dec

# Usage
@iframe("//iframe[@class='cheditor-editarea']")
def bodywrite(self, body):
   driver = self.driver
   # do wirting on body



Selenium IDE

대략적으로는 selenium IDE 는 imacro 와 비슷한데, Selenium 자체는 좀 더 광범위한 project 같다. 홈페이지에 보면 다양한 언어로 browser 를 automation 하는 법을 제공하고 있다.

일단 간단하게 사용하는 방법으로 Selenium IDE 라고 불리는 firefox plugin 을 사용하려면 아래 링크들을 참고하자.

IDE Plugin

이녀석은 Plugin system 도 가지고 있다. 그래서 기본적으로 제공하는 test case 의 저장이외에도 편리한 기능들을 plugin 으로 다운받아서 사용할 수 있다.

IDE 사용

plugin 을 설치하고 나면, 아래처럼 브라우저에 버튼이 생긴다. 버튼을 누르면 Selenium IDE 가 뜬다.  기본적으로 record 버튼이 눌려진 상태가 되는데, 이 상태에서 browser 에서 어떤 일을 하면 자동으로 기록된다.


IDE Tips

store

변수 선언 예제

Command / Target /Value  :  store / paul@mysite.org / userName
변수 사용시 : ${userName}


openWindow

새로운 tab 을 열때 사용할 수 있다. 참고로 이를 위해서 "popup 차단"을 꺼놔야 한다.
openWindow ${mylink}

아래처럼 이름을 추가할 수도 있다.
Selenium.openWindow("http://google.co.in","MyWindow");
Selenium.selectWindow("MyWindow");
waitForElementPresent id=element_id
type id=element_id ${userName1}




Selenium 3.0

version 3.x 부터 web browser 이외에도 driver 설치가 필요하다. 설치를 안하면 아래와 같은 error message 를 보게 된다.

selenium.common.exceptions.WebDriverException: Message: ‘geckodriver’ executable needs to be in PATH


그리고 Actions 가 아직 geckodriver 에서 구현이 안된듯 하다.


Reference

댓글 없음:

댓글 쓰기