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

최근에 받은 트랙백

글 보관함



오늘은 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로 풀어서 넣었는데요.

직접 돌려서 결과를 해보면서 코드를 바꾼에 아니라서 혹시 맞지 않는 부분이 있을 수 있습니다.

참고하세요.


반응형

Comment

  1. ^^ 2014.07.29 00:42

    정말 유용한 정보네요~ 출처 남기고 퍼가도 될까요~?