2010-08-18 2 views
4

저희 팀은 JavaScript가 많이 사용되는 Selenium을 사용하여 애플리케이션을 테스트 해 왔습니다. 우리는 가끔씩 테스트가 실패 할 때 항상 문제를 겪었습니다. 테스트 횟수가 늘어남에 따라 하나의 테스트에서 2 가지 테스트가 실패 할 확률이 높아졌습니다.Selenium으로 Ajax 응용 프로그램을 테스트하고 안정적으로 유지하려면 어떻게합니까?

우리가 최근에 알아 낸 것은 초기화 JavaScript가 이벤트 처리기를 클릭 한 요소에 첨부 할 기회를 갖기 전에 셀렌이 링크를 클릭하는 경쟁 조건이있을 가능성이 높다는 것입니다. 물론이 시점에서 우리가 찾고있는 효과는 발생하지 않으며 실패한 테스트를 받게됩니다.

당분간은 클릭하기 전에 약간의 시간 지연을 추가하여 초기화 JavaScript 코드가 끝나기까지 시간이 걸렸습니다. 이것은 분명히 조금 해킹되어 전체 테스트 실행에 시간을 추가하고 테스트가 여전히 실패하므로 더 나은 솔루션을 찾고 있습니다.

우리가 지금까지 생각해 낸 가장 좋은 아이디어는 Selenium이 기다릴 수있는 숨겨진 요소를 클릭 이벤트가 발생하기 전에 기다려서 준비가되었음을 알기 위해 숨겨진 요소를 주입하는 것입니다. 비동기 이벤트를 처리하고 요소를 제거하고 추가하는 경우 개발자 시간 측면에서 많은 추가 오버 헤드가 발생합니다. 또한 응용 프로그램에 실제로 필요하지 않은 추가 항목을 페이지에 추가합니다.

더 좋은 전략이 있습니까? 이 문제를 효과적으로 해결하기 위해 무엇을 했습니까?

답변

2

나는 당신과 정확히 같았습니다 : 약간의 지연을 추가하고 페이지에 몇 가지 요소가 나타날 때까지 기다리십시오. 그리고 나는 그것으로 완벽하게 멋지다. 아마 Webdriver/selenium 2.0으로 전환해도 도움이 될 것입니다. 인 메모리 데이터베이스로 작업하거나 테스트간에 동일한 셀렌/셀레늄 서버를 공유하거나 심지어 병렬화 (예 : TestNG로 쉽게)하면 테스트 실행을 줄일 수 있습니다.

+0

여러 대의 컴퓨터에서 동시에 많은 테스트를 실행하는 우수한 Selenium Grid가 있습니다. –

+0

이것은 우리가 한 일의 종류입니다. 나중에 그것을 고칠 의도로. 대체로 안정적이지만 몇 가지 테스트에는 여전히 문제가 있습니다. 나는 그것이 단지 진행중인 전투라고 생각한다. – William

3

우리는 셀레늄이 (WebDriver)로 이동하여 Page Objects pattern를 사용하는 PageFactory/AjaxElementLocatorFactory -이의 예 here

+1

Thx, 이제는 페이지 객체 패턴을 사용하기 위해 모든 셀렌 테스트를 다시 작성하고 싶습니다. :) –

1

당신이 waitForElementPresent 명령을 시도하고 다음을 클릭 할 적이있다?

1

레이스 조건을 제거하려면 메서드와 결합 된 Selenium의 runScript(String initCondition)을 사용하십시오.

예를 들어 테스트하려는 AJAX 기능으로 인해 dom에 새 요소가 추가되는 경우 다음과 같은 것을 사용할 수 있습니다. 요소가 추가 될 때

String jsPoll = ""; 
jsPoll += "selenium.browserbot.getCurrentWindow()"; 
jsPoll += ".document.getElementById('DOMID')"; 
selenium.waitForCondition(jsPoll, "30000"); 

조건은 진정한 평가되고 방법은 계속 될 것이다. 당신의 AJAX 함수가 요소를 바꾼다면 (예 : 비슷한 div로 식별되는 하나의 div) 다음과 같이 조건을 초기화 할 수 있습니다.

String jsInit = ""; 
jsInit += "!selenium.browserbot.getCurrentWindow()"; 
jsInit += ".document.getElementById('DOMID').setAttribute('SELENIUMTEST','1')"; 
String jsPoll = ""; 
selenium.runScript(jsInit); 
jsPoll += "selenium.browserbot.getCurrentWindow()"; 
jsPoll += ".document.getElementById('DOMID').getAttribute('SELENIUMTEST') != 1"; 
selenium.waitForCondition(jsPoll, "30000"); 

조건은 요소가 AJAX 함수에 의해 스왑 아웃 될 때 true로 평가됩니다.

1

IMHO 지연은 좋은 해결책이 아닙니다 (단지 일시적인 해결책 임).

우리는 까다로운 AJAX (및 플래시)를 테스트하기 위해 iMacros의 이미지 인식 기능을 사용합니다. 셀렌의 경우 AutoHotKey (기본 이미지 검색 기능이 포함되어 있으며 데스크톱 응용 프로그램 테스트 도구로 널리 사용됨)와 결합 할 수 있습니까? http://www.autohotkey.com/docs/commands/ImageSearch.htm

관련 문제