PageBase.java
GoogleSearchPage.java
GoogleSearchResultPage.java
GoogleSearchSuggestPage.java
GoogleSearch_withPageObject.java
지난 글에서는 위 클래스 중 PageBase.java 코드를 분석했습니다.
이번에는 GoogleSearch_withPageObject 안에 있는 testGoogleSearch() 메소드에서 사용하는 클래스들(GoogleSearchPage,GoogleSearchResultPage)을 공부해 보겠습니다.
public class GoogleSearchPage extends PageBase{
private final static String pageTitle = "Google";
private final static String SEARCH_FIELD_NAME = "q";
/** Constructor */
public GoogleSearchPage(WebDriver driver){
super(driver, pageTitle);
// set the default URL
URL = "http://www.google.com";
}
/** Returns the default URL */
public String getURL(){
return URL;
}
/** Enter the Search Text in the Search form field */
public void enterSearchForm(String searchText){
driver.findElement(By.name(SEARCH_FIELD_NAME)).sendKeys(searchText);
}
/** Submit the form and return the next page object.
* Seperate function should be in a seperate method. */
public GoogleSearchResultPage submitForm(){
driver.findElement(By.name(SEARCH_FIELD_NAME)).submit();
return new GoogleSearchResultPage(driver);
}
}
이 클래스를 보면 PageBase 를 extends 한것을 보실 수 있습니다.
이 PageBase 클래스를 상속함으로서 PageBase 클래스 안에 정의된 여러 기능들을 사용할 수 있습니다.
PageBase 클래스는 지난 글에서 분석했습니다.
GoogleSearchPage 클래스 안을 보면 우선 pageTitle이라는 String 객체를 초기화 하고 여기에 Google 글자를 할당했습니다.
그리고 SEARCH_FIELD_NAME 객체를 초기화 해서 q 라는 텍스트를 초기화 하구요.
이 두 String은 private로 선언해서 이 클래스 내부에서만 사용할 수 있고 static을 선언해서 클래스 내의 여러 인스턴스들이 공유할 수 있는 변수로 사용하겠다는 겁니다. 그리고 final 은 상수처럼 이 값을 나중에 바꾸지 못하게 하는 겁니다.
다음에 보니까 GoogleSearchPage() 메소드가 있네요. 이 메소드는 WebDriver를 파라미터로 전달 받습니다.
그리고 super()를 사용해서 PageBase 의 생성자를 실행시킵니다. 파라미터로는 WebDriver와 pageTitle을 전달하구요.
그리고 URL이라는 변수에 http://www.google.com 를 할당합니다.
이 URL은 PageBase에서 proteted로 선언된 String 입니다. GoogleSearchPage는 PageBase를 상속했기 때문에 이 변수를 사용할 수 있는 겁니다.
그 다음은 getURL() 메소드가 있고 이 메소드는 URL을 return 합니다.
그리고 enterSearchForm() 메소드가 String을 파라미터로 받습니다.
그리고 이 메소드에서 하는 일은 By.name으로 해당 Element를 찾고 즉 name이 q 인 Element를 찾고 여기에 전달받은 파라미터를 input 합니다.
다음 submitForm()은 전달받는 파라미터는 없지만 GoogleSearchResultPage 클래스를 return 하는 메소드 입니다.
여기서 하는일은 By.name으로 Element를 찾아서 그것을 submit 하도록 합니다.
그리고 GoogleSearchResultPage()를 실행해서 그 결과를 return 합니다.
자연스럽게 여기서 GoogleSearchResultPage 클래스를 보게 됐네요.
public class GoogleSearchResultPage extends PageBase{
private static final String resultStats_id = "resultStats";
private final static String pageTitle = "Google Search";
public GoogleSearchResultPage(WebDriver driver){
super(driver, pageTitle);
}
/** Returns the search ResultStat. */
public String getSearchResultStat(){
return driver.findElement(By.id(resultStats_id)).getText();
}
}
이 클래스도 PageBase를 상속 받았습니다.
그리고 resultStats_id라는 String 변수에 resultStats를 할당하고 pageTitle 이라는 String 변수에는 Google Search를 할당합니다. 모두 final로 선언해서 이 값을 바꾸지 못하도록 합니다.
이어서 나오는 생성자는 super()를 사용해서 PageBase의 생성자를 실행시킵니다.
그리고 getSearchResultStat() 메소드에서는 By.id로 resultStats_id 값을 가지고 있는 id를 찾아서 거기에 있는 텍스트를 get 하고 그 결과를 return 합니다.
이제 PageBase 와 GoogleSearchPage 그리고 GoogleSearchResultPage를 모두 분석했습니다.
그러면 이제 GoogleSearch_withPageObject 의 testGoogleSearch() 메소드를 살펴 볼 수 있습니다.
public static void testGoogleSearch(){
//Create a new instance of GoogleSearch page
GoogleSearchPage googleSearchPage = new GoogleSearchPage(new HtmlUnitDriver());
// go to Google ("http://www.google.com")
googleSearchPage.open();
// Enter something to search for
googleSearchPage.enterSearchForm("Cheese!");
// Now submit the form, and get the next page object
GoogleSearchResultPage googleSearchResultPage = googleSearchPage.submitForm();
// Verify: Check the title of the page
String pageTitle = googleSearchResultPage.getTitle();
System.out.println("Page title is: " + pageTitle);
assertTrue("Got title: " + pageTitle, pageTitle.contains("Cheese!"));
}
처음에 new GoogleSearchPage()를 생성하는데 여기에 파라미터로 HtmlUnitDriver() 를 보내죠?
그러면 GoogleSearchPage 클래스의 생성자를 봐야 되는데요.
저 위에서 봤듯이 이 생성자에서는 super() 를 사용해서 PageBase의 생성자를 호출합니다.
파라미터로는 WebDriver를 보내는데 이것은 testGoogleSearch() 메소드에서 HtmlUnitDriver()를 보냈습니다. 그리고 다른 파라미터는 GoogleSearchPage 클래스에서 만든 pageTitle 이라는 String 값을 보내게 됩니다.
그러면 PageBase 의 생성자를 볼까요?
여기서는 WebDriver 객체를 전달받은 파라미터 즉 여기서는 HtmlUnitDriver()를 사용해서 생성합니다. 그리고 pageTitle은 전달받은 pageTitle로 세팅을 하구요.
즉 GoogleSearchPage googleSearchPage = new GoogleSearchPage(new HtmlUnitDriver()); 이 한줄은 WebDriver를 생성하기 위해 만든건데요. 이 WebDriver를 만드는 기능이 GoogleSearchPage클래스와 PageBase 클래스에 나눠져 있고 그 기능들을 사용하는 겁니다.
그 다음에는 googleSerchPage.open()을 사용했는데요. 이 메소드는 PageBase에 있는 open() 메소드를 사용해서 drever.get()을 하도록 합니다.
여기서는 GoogleSearchPage 에서 정해진 URL 인 http://www.google.com으로 가는 겁니다.
그리고 enterSearchForm() 메소드를 호출하고 파라미터로 Cheese! 를 전달합니다.
이 enterSearchForm() 메소드는 GoogleSearchPage 클래스에 있죠?
이 전달된 Cheese! 값을 해당 페이지의 name 이 q 인 Element에 input 하는 겁니다.
그 다음에는 GoogleSearchResultPage 객체를 만들어서 거기에 GoogleSearchPage의 submitForm()메소드에서 return 된 값을 할당하구요.
이 submitForm() 메소드는 해당 form 을 submit 하고 GoogleSearchResultPage() 생성자를 실행시켜서 그 결과값을 return 하는 거였죠?
GoogleSearchResultPage() 생성자는 해당 WebDriver와 pageTitle (여기서는 Google Search)을 파라미터로 PageBase 클래스에 전달해서 새롭게 WebDriver와 pageTitile을 만듭니다.
그 다음에는 새로 이동된 페이지의 Title을 을 get() 해서 콘솔에 뿌려주고 이 Title에 Cheese!라는 글자가 들어 있는지 테스트 합니다.
여기까지가 testGoogleSearch() 메소드가 동작하는 것을 분석한 겁니다.
이 작업은 page objects를 사용하지 않은 GoogleSearch 클래스의 testGoogleSearch()와 정확히 같은 동작을 합니다.
다만 GoogleSearch_withPageObject 클래스의 testGoogleSearch()는 page objects를 사용해서 그 기능을 여러 클래스에 분담해서 그 기능들을 가져다 쓰는 식으로 설게 된 겁니다.
다음에는 GoogleSearch_withPageObject 클래스의 testGoogleSearch()를 분석해 보겠습니다.
'TDD Project > Selenium Web Driver' 카테고리의 다른 글
Selenium WebDriver - Alert Control, Escape key (0) | 2013.12.06 |
---|---|
Selenium Webdriver - iframe 사용하기 (2) | 2013.12.05 |
Selenium WebDriver CSS Selector Tip - List<WebElement> (0) | 2013.12.04 |
Selenium WebDriver 에서 JavascriptExecutor 사용할 때 유념해야 될 상황 (0) | 2013.12.02 |
Page Objects in Selenium 2 (Web Driver) 소스 분석 (with Page Objects) 04 (0) | 2013.10.30 |
Page Objects in Selenium 2 (Web Driver) 소스 분석 (with Page Objects) 02 (0) | 2013.10.25 |
Page Objects in Selenium 2 (Web Driver) 소스 분석 (with Page Objects) 01 (0) | 2013.10.25 |
Page Objects in Selenium 2 (Web Driver) 소스 분석 (without Page Objects) (0) | 2013.10.25 |
Page Objects in Selenium 2 (Web Driver) (0) | 2013.10.24 |
Selenium 2/WebDriver Quick Tips: Page Object Navigation Strategies (0) | 2013.10.21 |