C# 프로그래밍 기초 실습 전자책

Web Automation

웹 브라우져를 컨트롤하여 웹사이트를 자동으로 테스트하는 것을 Web Test Automation이라 부르는데, 이러한 Web Test Automation 도구로 Selenium, Watin, Test Studio 등 여러가지가 있다. 여기서는 이 중 Selenium을 사용한 Web Automation에 대해 알아본다.

Selenium 설치

Selenium은 Selenium Server와 Selenium Client가 있는데, 로컬 컴퓨터의 웹 브라우져를 컨트롤하기 위해서는 Selenium Client 를 사용한다. Selenium Client는 WebDriver라는 공통 인터페이스와 각 브라우져 타입별(IE, Chrome, FireFox 등) Browser Driver로 구성되어 있다. (여기서는 Selenium 3.0을 사용)

(1) 먼저 Selenium Client의 WebDriver를 설치하기 위해서는 Selenium 웹사이트에서 다운로드 받거나 혹은 Nuget을 통해 설치하면 된다.

아래는 Selenium 웹사이트의 다운로드 페이지인데, Selenium Client는 각 언어별 Language Binding을 사용한다. 이 방식으로 다운로드된 Zip 파일 안에는 WebDriver.chm 라는 Help 파일이 포함되어 있다.

Nuget으로 Selenium Client를 설치하기 위해서는 Package Manager Console에서 아래와 같은 명령을 실행한다.

PM> Install-Package Selenium.WebDriver

(2) 다음으로 각 Browser Driver를 설치해야 하는데, 이는 Selenium 다운로드 페이지 중 [Third Party Drivers] 섹션을 참고한다. 다음은 주요 Browser Driver에 대한 링크이다.

  • Firefox Driver : https://github.com/mozilla/geckodriver/releases
  • Chrome Driver : https://sites.google.com/a/chromium.org/chromedriver
  • IE Driver : http://www.seleniumhq.org/download 웹페이지의 [The Internet Explorer Driver Server] 섹션
위 드라이버들을 다운받아 실행경로 환경변수 PATH에 추가해 주거나 VS 빌드 실행폴더에 추가해 준다. 만약 프로그램 실행시 이 드라이버 EXE 파일이 없으면 에러가 발생한다.

Selenium 기초

Selenium에서 웹 브라우져를 컨트롤하기 위한 핵심 타입은 IWebDriver 인터페이스이다. Firefox를 사용하기 위해서는 FirefoxDriver 클래스 객체를 생성하여 IWebDriver 인터페이스에 할당하고, 마찬가지로 Chrome을 사용하기 위해선 ChromeDriver 클래스, IE를 사용하기 위해선 InternetExplorerDriver 클래스로부터 객체를 생성하여 IWebDriver 인터페이스에 할당한다.

using System;
using System.Threading;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
//using OpenQA.Selenium.Chrome;

namespace SeleniumApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (IWebDriver driver = new FirefoxDriver())
            {
                driver.Url = "http://www.csharpstudy.com";

                IWebElement q = driver.FindElement(By.Name("q"));
                q.Clear();
                q.SendKeys("HttpWebRequest");
                driver.FindElement(By.Name("sa")).Click();
                
                Thread.Sleep(5000);
            }
        }
    }
}
(위 예제는 FireFox로 csharpstudy.com 홈페이지를 띄우고 우측 상단의 검색창에 HttpWebRequest 라는 문자열을 입력하여 조회하는 코드이다.)

일단 IWebDriver 인터페이스를 얻은 후에는, 이 인터페이스의 메서드 및 속성을 사용해서 브라우져를 컨트롤하게 된다. 우선 기본적으로 IWebDriver의 Url 속성에 웹페이지 URL을 지정하면 브라우져에 해당 웹페이지를 띄우게 된다. 또한, 웹페이지 상의 특정 Element 를 찾기 위해 FindElement (혹은 복수개인 경우 FindElements) 메서드를 사용한다. FindElement() 메서드는 어떻게 Element를 찾을 것인지 검색 방식과 검색 조건을 지정하는 By 클래스 객체를 받아들인다. By라는 클래스는 여러 검색 방식을 Static 메서드로 정의해 두었는데, 예를 들어, HTML의 id 로 찾는다면 By.Id("myId")와 같이 By.Id() 메서드를 사용하고, HTML의 name 속성으로 찾는다면, By.Name("txtName") 과 같이 Name() 메서드를 사용한다. By 클래스는 이밖에 HTML class 속서으로 찾는 By.ClassName(), CSS Selector로 찾는 By.CssSelector(), 링크텍스트로 찾는 By.LinkText(), HTML 태그명으로 찾는 By.TagName(), XPath로 HTML의 복잡한 계층구조를 짧은 식으로 접근할 수 있도록 하는 By.XPath() 등의 메서드들을 제공하고 있다.

이렇게 FindElement() 메서드를 통해 해당 Element는 IWebElement 인터페이스로 리턴되는데, IWebElement 인터페이스를 통해 (예를 들어 어떤 텍스트 박스에) 어떤 텍스트를 쓰기 위해서는 SendKeys() 메서드를 호출한다. 또한, 해당 Element의 텍스트를 읽기 위해서는 Text 속성을 사용하고, Element의 Attribute를 가져 위해서는 GetAttribute() 메서드를 사용한다. 이밖에 IWebElement의 Click()은 버튼 같은 Element를 클릭하게 되며, Clear()는 텍스트박스 안의 문자열을 삭제한다.

Selenium의 다른 예제들

Selenium을 사용한 몇가지 다른 예제들을 들어보자. 다음 예제는 Selenium을 통해 Facebook에서 자동으로 로그인하는 코드이다.즉, Facebook 홈페이지를 띄우고 로그인명 텍스트박스의 id인 email 과 암호 id인 pass를 찾아 값들을 채워넣고 버튼을 클릭하여 로그인한다.

/*
using System.Threading;
using OpenQA.Selenium;
using OpenQA.Selenium.IE;
*/

// 페이스북에 로그인하기 

IWebDriver driver = new InternetExplorerDriver();

driver.Url = "https://www.facebook.com/";            
driver.Manage().Window.Maximize(); //브라우져 최대 확대

IWebElement email = driver.FindElement(By.Id("email"));            
email.SendKeys("alex@csharpstudy.com");
driver.FindElement(By.Id("pass")).SendKeys("");
driver.FindElement(By.Id("loginbutton")).Click();            
Thread.Sleep(5000);

driver.Close();
한가지 주목할 점은 Selenium과 같은 UI Automation 도구를 사용하는 경우 UI가 변하면 코드가 동작하지 않을 수 있다는 점이다. 일반적으로 UI가 조금만 변해도 XPath 같은 계층구조는 쉽게 변하는 반면, id나 name같은 Attribute는 잘 변하지 않으므로 이들을 통해 Element를 검색하는 것이 더 좋다.

또다른 예제로서 아래는 Chrome에서 네이버를 접속하여 [최신영화순위]를 검색, 그 중 1위 영화의 제목을 출력하는 예이다. 즉, 네이버 홈페이지에 있는 검색창에 [최신영화순위]라는 문자열을 써 넣고 검색 버튼을 눌러 결과 웹페이지로 이동한다. 다음 결과 페이지에서 1위 영화를 찾아내어 그 제목을 발췌하는 것이다.

/*
using System.Threading;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
*/

// 네이버에서 1위 최신영화 찾기 
IWebDriver driver = new ChromeDriver();

driver.Url = "http://www.naver.com";
driver.Manage().Window.Maximize();

IWebElement q = driver.FindElement(By.Id("query"));
q.SendKeys("최신영화순위");
driver.FindElement(By.Id("search_btn")).Click();            
Thread.Sleep(5000);

// 1위 제목 출력
var rank = driver.FindElement(By.ClassName("list_rank"));
var rankOne = rank.FindElement(By.XPath(".//li[0]/h4/a"));
string title = rankOne.Text;
Console.WriteLine(title);  

driver.Close();

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

Previous Next Print



C# 스터디 소셜미디어