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
- driver.switch_to.frame(): driver.switch_to.frame(frame_reference=driver.find_element_by_xpath("//iframe[@class='cheditor-editarea']"))
- driver.switch_to.default_content()
- javascript 실행하기
- driver.execute_script()
driver.execute_script("arguments[0].innerHTML = 'My Text';", elm)
참고 : elm 이 arguments[0] 가 된다. - driver.set_page_load_timeout(30)
- driver.switch_to().alert().accept();
화면에 element 가 보이지 않는 경우
때로는 화면에 element 가 보이지 않는 경우- WebDriverWait(webdriver, time).until(EC.presence_of_element_located((by, element)))
- WebDriverWait(webdriver, time).until(EC.element_to_be_clickable((by, element)))
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 을 사용하려면 아래 링크들을 참고하자.
- Selenium IDE page
- Selenium IDE 설치
- Selenium IDE Katalon Recorder : 새롭게 등장했다. Selenium IDE 와 호환되고, 그외의 자동화 테스트를 가능하게 해주는듯 하다.
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 에서 구현이 안된듯 하다.
- Actions are not implemented · Issue #233 · mozilla/geckodriver · GitHub
- geckodriver - Actions Class not working with gecko driver - Stack Overflow
댓글 없음:
댓글 쓰기