본문 바로가기
Selenium

Selenium WebDriver

by yu901 2021. 9. 29.

Selenium WebDriver는 실제 사용자가 동작시키는 것처럼 브라우저를 구동하는 웹 프레임워크이다.

 

 

 


Selenium WebDriver


Selenium WebDriver는 언어 바인딩과 개별 브라우저 제어 코드의 구현 모두를 가리킨다. 이것은 흔히 WebDriver라고 불린다.

 

 

Basic Communication

 

WebDriver는 드라이버를 브라우저와 통신한다. 통신은 양방향이다. WebDriver는 드라이버를 통해 브라우저에 명령을 전달하고 동일한 경로를 통해 정보를 다시 수신한다.

 

드라이버는 Google Chrome/Chromium용 ChromeDriver, Mozilla Firefox용 GeckoDriver 등과 같이 브라우저에 따라 다르다. 드라이버는 브라우저와 동일한 시스템에서 실행된다. 이는 테스트 자체가 실행 중인 시스템과 동일하거나 동일하지 않을 수 있다.

 

[그림 1] Basic Communication

 

 

Remote Communication

 

브라우저와의 통신은 Selenium Server 또는 RemoteWebDriver를 통한 원격 통신일 수도 있다. RemoteWebDriver는 드라이버 및 브라우저와 동일한 시스템에서 실행된다.

 

[그림 2] Remote Communication

 

 

Remote Communication with Grid

 

원격 통신은 Selenium Server 또는 Selenium Grid를 사용하여 수행될 수 있으며, 둘 다 호스트 시스템의 드라이버와 통신할 수 있다.

 

[그림 3] Remote Communication with Grid

 

 

 

 


 

이전 포스팅에서 Selenium IDE로 생성한 테스트 케이스를 Python 언어로 Export 하자. 아래와 같은 코드가 생성될 것이다.

(※ 탑승일은 지나지 않은 날짜로 변경하였다.)

# Generated by Selenium IDE
import pytest
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

class TestFlightSearch():
  def setup_method(self, method):
    self.driver = webdriver.Chrome()
    self.vars = {}
  
  def teardown_method(self, method):
    self.driver.quit()
  
  def test_flightSearch(self):
    self.driver.get("https://www.koreanair.com/kr/ko")
    self.driver.set_window_size(1281, 824)
    self.driver.find_element(By.XPATH, "//button[2]/span").click()
    self.driver.find_element(By.XPATH, "//ke-airport-chooser/div/div/input").click()
    self.driver.find_element(By.CSS_SELECTOR, "ke-airport-chooser>div>div>input").send_keys("NYC 뉴욕/모든 공항")
    self.driver.find_element(By.CSS_SELECTOR, "ke-airport-chooser>div>div>input").send_keys(Keys.ENTER)
    self.driver.find_element(By.CSS_SELECTOR, ".quickbooking__datepicker").click()
    self.driver.find_element(By.ID, "ipt-depature").click()
    self.driver.find_element(By.ID, "ipt-depature").send_keys("2021.10.09.")
    self.driver.find_element(By.ID, "ipt-arrival").click()
    self.driver.find_element(By.ID, "ipt-arrival").send_keys("2021.10.11.")
    self.driver.find_element(By.CSS_SELECTOR, ".dialog__confirm:nth-child(2)").click()
    self.driver.find_element(By.CSS_SELECTOR, ".quickbooking__find").click()

Export한 코드는 아래 코드를 추가하여 테스트를 실행할 수 있다. Selenium IDE로 Run all test 한 것과 동일하게 브라우저가 구동된다.

test = TestFlightSearch()
test.setup_method("")
test.test_flightSearch()
test.teardown_method("")

 

 


 

코드를 수정하여 간단한 Unit Test를 만들 수 있다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import unittest
import HtmlTestRunner

class TestFlightSearch(unittest.TestCase):
  @classmethod
  def setUpClass(cls):
    cls.driver = webdriver.Chrome('D:/seleniumdrivers/chromedriver')
    cls.driver.implicitly_wait(10)
    cls.driver.maximize_window()

  def test_flightSearch(self):
    self.driver.get("https://www.koreanair.com/kr/ko")
    self.driver.find_element(By.XPATH, "//button[2]/span").click()
    self.driver.find_element(By.XPATH, "//ke-airport-chooser/div/div/input").click()
    self.driver.find_element(By.CSS_SELECTOR, "ke-airport-chooser>div>div>input").send_keys("NYC 뉴욕/모든 공항")
    self.driver.find_element(By.CSS_SELECTOR, "ke-airport-chooser>div>div>input").send_keys(Keys.ENTER)
    self.driver.find_element(By.CSS_SELECTOR, ".quickbooking__datepicker").click()
    self.driver.find_element(By.ID, "ipt-depature").click()
    self.driver.find_element(By.ID, "ipt-depature").send_keys("2021.10.09.")
    self.driver.find_element(By.ID, "ipt-arrival").click()
    self.driver.find_element(By.ID, "ipt-arrival").send_keys("2021.10.11.")
    self.driver.find_element(By.CSS_SELECTOR, ".dialog__confirm:nth-child(2)").click()
    self.driver.find_element(By.CSS_SELECTOR, ".quickbooking__find").click()
    
  @classmethod
  def tearDownClass(cls):
    cls.driver.quit()

  print('Test Done Successfully!')

if __name__ == "__main__":
  unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(output='reports'))

 

터미널에서 파일을 실행 시키면, 테스트를 실행하고 [그림 4]와 같이 테스트 결과를 기록한다.

> python test_flightSearch.py
Test Done Successfully!

Running tests...
----------------------------------------------------------------------

DevTools listening on ws://127.0.0.1:6400/devtools/browser/16b28df3-637c-4b0f-9fb6-46fcb07da17d
 test_flightSearch (__main__.TestFlightSearch) ... OK (10.612608)s

----------------------------------------------------------------------
Ran 1 test in 0:00:15

OK



Generating HTML reports...
reports\TestResults___main__.TestFlightSearch_2021-09-26_21-54-04.html

 

[그림 4] Unittest Result

 


 

참고

 

'Selenium' 카테고리의 다른 글

Selenium IDE  (0) 2021.09.07
Selenium  (0) 2021.08.26

댓글