2012-11-15 3 views
0

PHPUnit을 사용하여 애플리케이션 코드를 분리하고 테스트하는 동안 QA 팀은 Selenium으로 UI를 테스트 해 왔습니다. 테스트가 완료되는 데 10 시간 이상이 걸린다는 소식을 들었습니다. 너무 길다고 생각합니다. 내 질문은 정말 페이지를 처리 ​​할 때 AJAX 호출을 기다리는 방법에 관한 것입니다.Selenium으로 웹 페이지를 테스트하는 방법

예를 들어, AJAX 호출을 호출하여 표시 할 데이터에 대해 Google 서비스와 통신하는 수많은 입력이있는 페이지가 있습니다. 우리는 후속 선택 상자가 변경 될 때이를 필터링하는 여러 입력을가집니다. (지역에 속하는)을 (부문에 속하는) 지구 저장

Division 1 
    +- District 10 
     +- Store 100 
     +- Store 101 
     +- Store 102 
    +- District 11 
     +- Store 200 
     +- Store 201 
     +- Store 202 
Division 2 
    +- District 20 
     +- Store 300 
     +- Store 301 
     +- Store 302 
    +- District 21 
     +- Store 150 
     +- Store 151 
     +- Store 2002 
... 

이제 선택 박스 모두 초기로드만큼

사단 모든로드되므로, 최종 사용자가 임의의 선택할 수있다 그들의. 그러나 선택 상자에 선택이 있으면 AJAX는 부모 선택에 따라 다른 선택 상자를 다시로드합니다. IE : Division 2를 선택한 다음 구역 목록은 20 번째 및 21 번째 구역 (서비스 호출 사용)으로 필터링되며 저장소 목록은 해당 구역의 상점에만 필터입니다.

부문을 선택하지 않고 지구를 선택하면 백엔드에서 Google 서비스를 다시 사용하여 해당 매장의 상점에만 상점 목록이 다시 채워집니다.

내 질문은 AJAX 호출이 우리 서비스에서 반환 된 시간을 알고 선택 상자가 변경된 방법을 알고 싶습니다. 우리 QA 팀이 기다리고 있습니다. 그런 다음 선택 상자를 반복하여 반환 된 값이 모두 올바른지 확인하십시오. 선택 상자가 다시로드되면 언제 알 수있는 방법이 있습니까? 그러면 내용을 확인할 수 있습니까?

분명히, 우리는 서비스 작업을 검증하기 위해 모의 객체를 사용하여 이러한 검사의 대부분을 PHPUnit 테스트로 이동하려고하지만 QA 팀은 여전히 ​​실제 렌더링 된 결과가 일치하는지 확인하려고합니다.

의견을 보내 주시면 감사하겠습니다. 문제를 정확히 파악

답변

1

가이 시나리오에서 2 개 개의 다른 접근하고 장단점 아래로 나열됩니다 "아약스 호출이 완료 될 때까지 기다려야하는 방법"을 참조하십시오.

접근 : 한 많은 아약스 호출이 보류하는 방법, 따라서뿐만 아니라 셀레늄 텍스트에 같은 변수에 액세스 할 수 있습니다 나타내는 글로벌 변수와 코드 조각을 추가합니다.

$.activeAjaxRequestCount = 0; 

$().ajaxSend(function() { 
    $.activeAjaxRequestCount++; 
    // register lazily to make sure it's the last handler of 
    // ajaxError event and get executed after all production handlers 
    if(!$._ajaxErrorHandlerAdded) { 
    $().ajaxError(function() { 
     $.activeAjaxRequestCount--; 
    }); 
    $._ajaxErrorHandlerAdded = true; 
    } 
}) 
.ajaxSuccess(function() { 
    $.activeAjaxRequestCount--; 
}); 


/* C# code in selenium tests */ 

// run this js code somehow before selenium test 
// to turn off animation of jQuery 
Selenium.executeScript("$.fx.off = true"); 

private void WaitComplete(Action action, int timeout) 
{ 
    // do default selenium action 
    action(); 
    // wait for active ajax request count becomes zero, 
    // none ajax selenium action will return immediately 
    selenium.WaitForCondition("selenium.browserbot.getCurrentWindow(); 
          window.jQuery.activeAjaxRequestCount===0;", 
          timeout.ToString()); 
} 

프로 : 완전히 클라이언트 측

단점 : 하드 한 페이지에서 해고 여러 아약스 통화에서 완료된 아약스 전화를 찾아 낼 수 있습니다. 그러므로이 접근법에서 ... 모든 Ajax 호출이 완료 될 때까지 기다려야한다. 데이터는 이미 페이지에로드 될 수있다.

참조 : https://gist.github.com/111525

접근법 2 :이 접근 방식에서

, 우리는 성공하기 위해 Ajax 호출을 기다리는 그것은/표시 데이터를 보여줍니다. Selenium 방식으로 표현 : 특정 HTML 엔티티/데이터가 페이지에 나타날 때까지 테스트 실행을 기다립니다.

var Waiting = new WebDriverWait(X, TimeSpan.FromSeconds(5)); 
var Data_Loaded = Waiting.Until(driver => driver.FindElement(By.Id("Divisionxyz"))); 

프로 : 간단한 여러 아약스 호출이 단일 페이지를 통해 데이터를 가져 오는 해고하는 경우.

단점 : 동적 요소/개체가로드되면 작동하지 않습니다.

희망이 있습니다. ... 가장 좋은 모든 친구 :)

+0

고마워요. 요소가 있다는 문제가 있지만 데이터로드 시점을 알고 싶습니다 (선택 상자 생각, 현재 선택 항목 및 이전 선택 상자 변경 내용). 상자를 다시로드 할 때 이전에 채워진 요소를 기반으로 올바른 내용을 포함하는지 테스트하고 싶습니다. 엘리먼트가 항상 존재하기 때문에, AJAX 호출이 끝나기 전에 .FindElement가 작동하지 않습니다. –

+0

확실한 친구는 ... 당신을 돕고 싶습니다 ... 이미 존재하는 요소의 HTML 코드를 게시하고 Ajax 호출 완료 후 데이터가로드 될 수 있습니까? – Anuragh27crony

+0

몇 가지 샘플 코드를 작성해야합니다. QA 부서를 요청하고 있습니다. 우리 페이지가 생성되고 꽤 큽니다. 샘플을 만들어 보겠습니다. 원래 질문을 업데이트 할 수 있습니다. 도와 주셔서 감사합니다. –

관련 문제