오늘은 Selenium WebDriver로 테스트 케이스를 만들다가 가끔 아주 유용하게 쓰이는 로직을 따로 정리합니다.
public static void sample01(String selectItem) throws Exception {
List<WebElement> sampleValue = driver.findElement(By.cssSelector("div[id='aaa'][class='bbb'] *"));
for(WebElement sample : sampleValue)
{
if(sample.getText().equalsIgnoreCase(selectItem))
sample.click();
}
}
위 코드는 클릭해야 되는 아이템이 딱히 unique 한 id나 class 뭐 이런걸 갖고 있지 않아서 Selenium으로 그 WebElement를 가져오기 힘들 때 아주 유용하게 사용하고 있습니다.
해당 WebElement의 상위 WebElement들 중 확실하게 unique 하게 추려낼 수 있는 WebElement를 sampleValue에다 담습니다. 위에서는 샘플로 id 가 aaa 이고 클래스가 bbb 인 div WebElement가 그에 해당됩니다.
이 div WebElement 내에는 또 다른 div나 tag들이 있을 겁니다.
for 문으로 이 sampeValue를 돌리면서 그 하위 WebElement들의 text들을 불러 옵니다.
이 텍스트가 원하는 텍스트와 같을 때 이 텍스트를 click 할 수 있습니다.
위 경우는 예를 들어 Edit이라는 링크가 있는데 해당 화면에는 이 Edit 이라는 링크가 많고 내가 딱히 클릭하고 싶은 Edit 링크는 어떤 unique 한 Attribute도 가지고 있지 않을 때 사용할 수 있습니다.
클릭하고자 하는 Edit을 감싸고 있는 부모 WebElement들 중에서 unique 한 속성을 가지고 있는 놈을 찾아서 List에 담고 이 리크트를 돌리면서 그 안에 있는 텍스트가 Edit이면 그것을 클릭하는 겁니다.
여기서 충족되어야 할 조건은 리스트에 담긴 부모 엘리먼트 안에는 Edit이라는 글자를 가지고 있는 WebElement가 내가 클릭하고자 하는 그 Edit WebElement 딱 하나라야 겠죠.
public static void pageNavigationSampe(String selectItem) throws Exception{
int exist = 0;
int firstPage = 0;
int pageNum = 1;
do{
if(firstPage==0) {
exist = checkAAAexist(selectItem);
firstPage=1;
} else {
pageNum = pageNum+1;
String PageCss = "a[id='goToPageId][pagenumber='" + pageNum + "']";
driver.findElement(By.cssSelector(PageCss)).click();
Thread.sleep(5000);
exist=checkAAAexist(selectItem);
}
} while(exist==0);
}
public static int checkAAAexist(String selectItem) throws Exception {
List<WebElement> theItem = driver.findElements(By.cssSelector("input[type='button'][value='theItem']"));
int exist = 0;
for(WebElement clickItem : theItem)
{
if(clickItem.getAttribute("onClick").contains(vehicle)) {
clickItem.click();
exist=1;
Thread.sleep(3000);
break;
}
}
return exist;
}
위 예제는 게시판 형태로 돼 있는 페이지 중에서 내가 선택하고자 하는 WebElement가 어떤 때는 첫번째 페이지에 있다가 또 어떤때는 두번째 페이지에 있고...
뭐 이렇게 테스트시마다 다른 페이지에 있을 수 있는 아이템을 다뤄야 할 때 사용할 수 있습니다.
상황은 클릭해야할 버튼이 있는데 이 버튼은 테이블의 각 row마다 있고 그 중 하나만 클릭해야 됩니다.
이 버튼을 나타내는 속성은 공통된 부분이 있을 겁니다.
그걸 checkAAAexist() 메소드에서 처럼 theItem 에 리스트로 담구요.
이 리스크를 for 문으로 돌리면서 원하는 텍스트를 가지고 있는 놈이 나오면 그 놈을 클릭합니다.
이건 위의 예제와 별반 다르지 않은데요.
문제는 이 페이지에 없으면 다음 페이지로 넘어가야 한다는 거죠.
그래서 pageNavigationSampe() 메소드를 만든겁니다.
처음에 checkAAAexist()를 호출해서 원하는 놈이 없다는 결론을 받으면 다음 페이지를 클릭하는 거죠.
여기서 중요한것은 각 페이지마다 걸려 있을 링크 (1,2,3,4... 이런 숫자에 링크들이 있겠죠.)..
이 링크들의 속성들의 규칙을 알아야 합니다.
대개 위 예제처럼 다 똑같고 1페이지 2페이지 3페이지 등등에 해당되는 링크들은 해당 숫자들이 들어가는 부분이 있을 겁니다.
그것을 위에서와 같이 해당 숫자 부분을 매번 +1 씩 해줘서 넣으면 계속 다음 페이지를 클릭할 수 있습니다.
만약에 원하는 놈이 나오면 클릭하고 break; 를 만나서 해당 루프를 빠져 나오겠죠.
위 로직에서는 이 break; 가 없어도 while() 문에서 체크해서 빠져 나오게 만들었지만.. 확실하게 하기 위해서 break; 문도 넣었습니다.
중간에 Thread.sleep()을 넣은 이유는 웹 UI에서는 링크를 클릭한 후 다음 페이지로 넘어가는데 시간이 걸리니까 곧바로 다음 Action을 취하면 Fail이 되는 경우가 많습니다.
그래서 강제로 Thread.sleep()을 넣어 준 겁니다.
원래 이상적인 방법은 다음 페이지에 나오는 특정 WebElement를 wait하는 방법이 있긴 한데요.
이 예제에서는 그것까지 다루지는 않겠습니다.
위 예제 중 Selenium WebDriver의 API와 약간 다른부분이 있을 수 있습니다.
제가 참여하고 있는 프로젝트에서는 이 Selenium WebDriver를 편리하게 다루가 위한 프레임워크를 따로 제작해서 사용하고 있거든요.
그래서 그 프레임워크의 API가 있는 부분은 따로 Selenium WebDirver의 API로 풀어서 넣었는데요.
직접 돌려서 결과를 해보면서 코드를 바꾼에 아니라서 혹시 맞지 않는 부분이 있을 수 있습니다.
참고하세요.
'TDD Project > Selenium Web Driver' 카테고리의 다른 글
[Selenium] Double Click and Execute JavaScript -Tip - (0) | 2014.02.13 |
---|---|
[Selenium] 유저가 입력한 정보 관리자 모드에서 확인하는 테스트 만들기 (0) | 2014.02.03 |
[Selenium] 두개의 시나리오나 여러 브라우저 작업을 한개의 suite 로 처리하기 (1) | 2014.02.02 |
[Selenium] IE 브라우저 사용할 때 지켜야 할 점들 (2) | 2014.01.27 |
[Selenium] Select Option 관련 로직 정리 (0) | 2014.01.27 |
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 |