반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Selenium WebDriver Tutorial 03

2013. 10. 19. 02:44 | Posted by 솔웅


반응형

이 글은 Selenium WebDriver 튜토리얼을 3번에 걸쳐 번역한 글 중 하나입니다.

원본은 여기에 있습니다.



Driver Specifics and Tradeoffs



Selenium-WebDriver’s Drivers



WebDriver는 작성되어야 할 테스트에 대한 key interface 이름입니다. 여기에는 몇개의 implementation들이 있습니다. 그것들을 살펴보겠습니다.



HtmlUnit Driver

이것이 현재 가장 빠르고 가장 가벼운 implemeatation 입니다. 이것은 HtmlUnit에 기초하고 있습니다. HtmlUnit은 GUI 가 없는 WebBrowser의 자바 베이스 implementation입니다. 자바 이외의 언어는 이 드라이버를 사용하기 위해 Selemium Server를 binding 해야 합니다.


Usage


WebDriver driver = new HtmlUnitDriver();


장점

    WebDriver를 가장 빨리 implementation 함
    pure Java solution으로 플랫폼 독립적이다.
    자바스크립트를 지원함


단점

    다른 브라우저의 자바스크립트 behaviour 를 Emulate 해야 한다.

   



JavaScript in the HtmlUnit Driver


주요 브라우저들은 HtmlUnit (Rhino)에 의해 사용되는 자바스크립트 엔진을 사용하지 않습니다. HtmlUnit을 사용하는 자바스크립트를 테스트 한다면 이 브라우저들에서는 그 결과가 다르게 나올 겁니다.


우리가 자바스크립트라고 말할 때 실제 이 의미는 자바스크립트와 DOM을 말하는 겁니다. DOM 이 W3C에 의해 정의 됐음에도 불구하고 각 브라우저들은 이 DOM의 implementation과 관련해서 자기들만의 방법을 사용하고 있습니다. 그래서 그에 따라 자바스크립트가 어떻게 작동하는지도 서로 다릅니다. HtmlUnit은 DOM을 implementation 하는 아주 확실한 방법입니다. 그리고 자바스크립트를 사용하기 위한 좋은 방법을 지원하고 있습니다. 하지만 다른 브라우저들도 그렇기는 합니다. W3C 표준과 여러 주요 브라우저들의 implementation들은 서로 다릅니다.


WebDriver와 관련해서 우리는 선택을 해야 합니다. HtmlUnit의 자바스크립트를 사용해서 팀원들이 실행할 때 생길 수 있는 위험성을 감수해야 할지 아니면 자바스크립트를 disable 해야 하는지요. 디폴트로는 HtmlUnit을 사용할 때 자바스크립트를 default로 함으로서 피해를 줄일수도 있겠죠. WebDriver와 HtmlUnit 모두를 release 하는데 있어 우리는 특정 부분에서 HtmlUnit의 디폴트로 자바스크립트를 enable 로 하기를 바랍니다.


Enabling JavaScript


그때까지 기다리기 힘드시면 자바스크립트를 enable 하도록 만드는것은 굉장히 쉽습니다.


HtmlUnitDriver driver = new HtmlUnitDriver(true);


이렇게 하면 HtmlUnit Driver에서 디폴트로 파이어폭스 3.6 버전의 자바스크립트를 emulate 합니다.



Firefox Driver

Firefox 플러그인을 사용해서 파이어폭스 브라우저를 사용할 수 있습니다. 사용되는 Firefox 프로파일은 Selenium WebDriver.xpi (플러그인)을 포함합니다. A few settings are also changed by default ((see the source to see which ones) ) Firefox Driver는 윈도우, 맥, 리눅스에서 실행하고 테스트할 수 있습니다.


Usage


WebDriver driver = new FirefoxDriver();


장점

    실제 브라우저에서 실행하고 자바스크립트를 지원함
    인터넷 익스플로러 Driver 보다 빠르다.

단점

    HtmlUnit Driver 보다 느리다.

   


Modifying the Firefox Profile


user agent string을 수정할 수도 있습니다. 그러려면 여러 유용한 extension들을 포함하고 있는 파이어폭스 프로파일을 trick out 해야 합니다. 이 프로파일을 obtain하는데는 두가지 방법이 있습니다. Firefox의 프로파일 매니저에 의해 프로파일이 생성됐다고 가정하고 아래 코드를 보겠습니다. (firefox -ProfileManager):


ProfilesIni allProfiles = new ProfilesIni();
FirefoxProfile profile = allProfiles.getProfile("WebDriver");
profile.setPreferences("foo.bar", 23);
WebDriver driver = new FirefoxDriver(profile);


프로파일이 Firefox로 register 되지 않았을 경우는 이렇게 합니다.


File profileDir = new File("path/to/top/level/of/profile");
FirefoxProfile profile = new FirefoxProfile(profileDir);
profile.addAdditionalPreferences(extraPrefs);
WebDriver driver = new FirefoxDriver(profile);


리눅스에서 Firefox에 native event들이 디폴트로 disable되어 있다면 다음과 같이 enable 되게 할 수 있습니다.


FirefoxProfile profile = new FirefoxProfile();
profile.setEnableNativeEvents(true);
WebDriver driver = new FirefoxDriver(profile);


Info


See the Firefox section in the wiki page for the most up to date info.


Internet Explorer Driver


이 driver는 .dll에 의해 콘트롤 됩니다. 이것은 Windows OS에서만 사용 가능합니다. Selenium 은 XP 의 버전 6,7,8 과 Windows7 상의 버전 9 에 맞게 만들었습니다.


Usage


WebDriver driver = new InternetExplorerDriver();


Pros

    실제 브라우저에서 실행되고 IE가 지원하는 자바스크립트를 지원한다.


Cons

    IE는 윈도우즈에서만 작동한다.
    비교적 느리다.
    대부분의 버전에서 native 하게 XPath를 지원하지 않는다. 다른 브라우저보다 느린 Sizzle이 자동적으로 inject 된다. 어떤 브라우저에서는 CSS selector와 비교할 때 더 느리다.
    버전 6,7에서는 CSS 가 native 적으로 지원하지 않는다. 대신 Sizzle이 inject 된다.
    IE 8,9에서 CSS selector는 native 이다. 하지만 그 브라우저에서는 CSS3를 완전히 지원하지 않는다.


Info

See the Internet Explorer section of the wiki page for the most up to date info. Please take special note of the Required Configuration section.



Chrome Driver


Chrome Driver는 Chromium project에 의해 유지되고 지원됩니다. WebDriver는 chromedriver binary를 통해서 Chrome과 함께 작동됩니다. (found on the chromium project’s download page). 이것을 사용하려면 chromedriver와 인스톨 된 chrome browser가 모두 있어야 합니다. chromedriver는 여러분 컴퓨터 내의 어딘가에 있어야 합니다. 그리고 그 경로를 세팅해서 WebDriver가 자동적으로 찾을 수 있도록 해야 합니다. Chrome browser는 chromedriver에 의해 인스톨된 경로를 자동으로 찾을 겁니다. 이런 것들은 환경변수로 overridden 할 수 있습니다. Please refer to the wiki for more information.


Usage


WebDriver driver = new ChromeDriver();



Pros

    실제 브라우저에서 동작되고 자바스크립트를 지원한다.
    Chrome이 Webkit-based 브라우저이기 때문에 Chrome Driver는 Safari에서 동작하는 것들에 대해서도 verify할 수 있습니다. Chrome은 V8 자바스크립트 엔진을 사용하고Safari는 Nitro 엔진을 사용합니다. 그러니까 JavaScript가 실행되는 것이 서로 다를 수도 있습니다.



Cons

    HtmlUnit Driver 보다 느리다.



Info


See our wiki for the most up to date info. More info can also be found on the downloads page



Getting running with Chrome Driver

Download the Chrome Driver executable and follow the other instructions on the wiki page



Opera Driver

See the Opera Driver wiki article in the Selenium Wiki for information on using the Opera Driver.

iPhone Driver

See the iPhone Driver wiki article in the Selenium Wiki for information on using the Mac iOS Driver.

Android Driver

See the Android Driver wiki article in the Selenium Wiki for information on using the Android Driver.




Alternative Back-Ends: Mixing WebDriver and RC Technologies



WebDriver-Backed Selenium-RC



자바버전의 WebDriver는 Selenium-RC API의 implementation을 제공합니다. 이 의미는 여러분이 Selenium-RC API에 있는 기능들을 WebDriver에서도 사용할 수 있다는 겁니다. 즉 이전 버전의 기능들도 모두 사용할 수 있다는 것이죠. 이미 Selenium-RC API를 사용한 테스트 suite들을 가지고 있는 분들이 WebDriver의 기능들을 사용해야 하는 분들에게 좋은 소식이죠. 이것을 Selenium-WebDriver로 migration을 쉽게 해 줍니다. 또한 두 API 모두를 한번에 사용할 수도 있습니다.


Selenium-WebDriver is used like this:


// You may use any WebDriver implementation. Firefox is used here as an example
WebDriver driver = new FirefoxDriver();

// A "base url", used by selenium to resolve relative URLs
 String baseUrl = "http://www.google.com";

// Create the Selenium implementation
Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);

// Perform actions with selenium

selenium.open("http://www.google.com");
selenium.type("name=q", "cheese");
selenium.click("name=btnG");

// Get the underlying WebDriver implementation back. This will refer to the
// same WebDriver instance as the "driver" variable above.
WebDriver driverInstance = ((WebDriverBackedSelenium) selenium).getWrappedDriver();

//Finally, close the browser. Call stop on the WebDriverBackedSelenium instance
//instead of calling driver.quit(). Otherwise, the JVM will continue running after
//the browser has been closed.
selenium.stop();


Pros

    WebDriver와 Selenium API를 함께 사용할 수 있다.
    Selenium RC API에서 WebDriver API로 migration 하는 간단한 방법을 제공한다.
    실행하기 위해 Selenium RC server를 필요로 하지 않는다.


Cons

    Does not implement every method
    모든 메소드를 implement 하지는 않는다.
    좀 더 advanced 한 Selenium 사용기능이 제대로 작동하지 않는다. (using “browserbot” or other built-in JavaScript methods from Selenium Core)
    어떤 메소드는 서로 다른 implementation으로 인해 느려질 수 있다.


   
Backing WebDriver with Selenium


WebDriver는 Selenium RC 보다 적은 브라우저들을 지원합니다. 그래서 Selenium RC 버전을 WebDriver API 버전으로 사용하려면 SeleneseCommandExecutor를 사용할 수 있습니다.



Safari는 이와 같은 방법으로 지원되는데요. 다음과 같이 코딩하면 됩니다. (be sure to disable pop-up blocking):


DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setBrowserName("safari");
CommandExecutor executor = new SeleneseCommandExecutor(new URL("http://localhost:4444/"), new URL("http://www.google.com/"), capabilities);
WebDriver driver = new RemoteWebDriver(executor, capabilities);


이렇게 접근하는 방법에는 중요한 몇가지 제한이 있습니다. findElements가 원하는대로 작동 안될 수도 있습니다. 또한 Selenium Core를 사용하기 때문에 자바스크립트 sandbox도 제한이 있습니다.


Running Standalone Selenium Server for use with RemoteDrivers


Selenium’s Download page에서 download selenium-server-standalone-<version>.jar 를 다운받으시고 옵션으로 IEDriverServer도 다운 받습니다. Chrome을 사용하려면 Google Code에서 다운 받으세요.


IEDriverServer와 chromedriver를 unpack 하고 이것을 $PATH / %PATH% 에 넣으세요. 그러면 추가적인 수정없이 IE와 Chrome 을 사용하실 수 있습니다.


Start the server on the command line with


java -jar <path_to>/selenium-server-standalone-<version>.jar


If you want to use native events functionality, indicate this on the command line with the option


-Dwebdriver.enable.native.events=1


For other command line options, execute


java -jar <path_to>/selenium-server-standalone-<version>.jar -help


In order to function properly, the following ports should be allowed incoming TCP connections: 4444, 7054-5 (or twice as many ports as the number of concurrent instances you plan to run). Under Windows, you may need to unblock the applications as well.



Additional Resources


WebDriver에 대해 좀 더 많은 것을 아시려면 WebDriver’s wiki를 보세요.


그리고 인터넷에서 Selenium-WebDriver’s drivers를 포함해서 Selenium과 관련된 여러 정보를 찾아보세요. Selenium과 관련한 여러 블로그와 포럼들이 있을 겁니다. 참고로 Selenium 사용자 그룹에도 정보가 아주 많습니다. http://groups.google.com/group/selenium-users



Next Steps.


이글은 WebDriver를 high level로 간단히 훑어 본 겁니다. 일단 Selenium-WebDriver API에 익숙해 지면 그 다음에는 어떻게 test suite들을 만드는지에 대해 궁금하실 겁니다. 요즈음 Selenium 전문가들이 접근하는 방법은 Page Factory를 사용해서 Page Object Design Pattern을 사용해서 테스트 코드를 디자인 하는 겁니다. Selenium-WebDriver는 자바와 C#에서 PageFactory 를 지원합니다. 이것은 next chapter에서  advanced topic을 다루는 글에서 다뤄집니다. 이 기술과 관련한 high-level description에 대해서는 Test Design Considerations chapter에서 다뤄 집니다. 이 두 글들은 여러분의 테스트 코드를 좀 더 유지보수하기 쉽도록 작성하는 방법을 알려 줍니다.

반응형