반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 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로 풀어서 넣었는데요.

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

참고하세요.


반응형


반응형

오늘 배운 Tip 하나 정리 해 둡니다.


Alert 창 떴을 때 Control 하는 법


Alert alert = driver.switchTo().alert();

alert.accept();


public void checkAlert() {
    try {
        WebDriverWait wait = new WebDriverWait(driver, 2);
        wait.until(ExpectedConditions.alertIsPresent());
        Alert alert = driver.switchTo().alert();
        alert.accept();
    } catch (Exception e) {
        //exception handling
    }
}


driver.switchTo().alert().accept();
or
driver.switchTo().alert().dismiss();

// Get a handle to the open alert, prompt or confirmation
Alert alert = browser.switchTo().alert();
// Get the text of the alert or prompt
alert.getText();
// And acknowledge the alert (equivalent to clicking "OK")
alert.accept();

WebDriver driver = new FirefoxDriver();
driver.get("http://localhost:8081/TestAutomation/Escape.jsp");
driver.manage().window().maximize();

WebElement txtBxHandle = driver.findElement(By.name("txtName"));        
txtBxHandle.sendKeys("Socrates");

Actions action = new Actions(driver);
action.sendKeys(Keys.ESCAPE).perform();

WebElement BnEnable = driver.findElement(By.name("btnSubmit"));
BnEnable.click();


반응형


반응형

Handling iFrames using WebDriver


inline frame은 현재의 HTML 문서 내에 다른 문서를 넣을 때 사용됩니다. 즉 iframe은 웹페이지 안에 있는 웹페이지를 말하는거죠. iframe은 별도로 DOM을 가지고 있습니다.

iframe을 사용하는 HTML 소스코드는 아래와 같이 사용하시면 됩니다





위의 코드를 보면 iframe안에 또 다른 iframe이 있는 걸 보실 수 있을 겁니다. 안쪽의 iframe으로 가려면 바깥쪽의 iframe 을 지나가야 되고 또 그 안쪽의 iframe 안에도 body가 있습니다.

그리고 나서 다시 안쪽의 iframe은 을 나와서 바깥쪽 iframe 까지 나오면 이제 OK 버튼을 보게 됩니다. 테스트를 작성하려면 이 과정을 거쳐야 합니다. iframe 안에 있는 element에 직접 접근하는 것은 가능하지 않습니다. iframe은 자신만의 DOM element를 가지고 있어서 그 안의 element들을 다루려면 switch to 를 해서 접근해야 합니다.


Selects the frame 1

driver.switchTo().frame("frame1");

Selects the frame2

driver.switchTo().frame("frame2");

Switching back to the parent window

driver.switchTo().defaultContent(); // 이제 iframe 바깥으로 완전히 빠져 나온 겁니다.

iframe의 value를 알지 못할 때도 있는데요. 그럴 때는 아래와 같이 tagName 메소드를 사요ㅇ해서 그 name을 얻을 수 있습니다.

driver.switchTo().frame(driver.findElements(By.tagName("iframe").get(0));



아래 메소드를 사용해서 iframe을 선택하실 수 있습니다.

    frame(index)
    frame(Name of Frame [or] Id of the frame
    frame(WebElement frameElement)
    defaultContent()


반응형