2016-06-05 4 views
4

장치에 작업을 보내고 모니터링하는 브라우저 기반 응용 프로그램의 e2e 테스트를 수행하려고합니다. 그런 다음 웹 페이지가 응용 프로그램에서 업데이트를 가져 오지만 자동 새로 고침은 수행하지 않습니다. 내 다음 코드의 목적은 브라우저를 새로 고침하여 작업 상태에 대한 업데이트를 얻고, 루프 카운터를 시작하고, 작업의 상태를 확인하고, 상태가 고정 된 경우 해당 상태를 콘솔로 보내고 루프에서 빠져 나가고, 그렇지 않으면 증분하는 것입니다 카운터가 만료되거나 고정되거나 실패하거나 잠금 상태가 반환 될 때까지 루프를 반복합니다. 또한 최종 작업 상태를 콘솔에 보냅니다.for 루프 및 각도기의 문제

browser.sleep(30000); 

    browser.refresh(); 

    for (var i = 0; i < 50; ++i) { 

     console.log('i is: ', i); 

     element(by.css('.deployment-card-status, result.status')).getText().then(function(text){ 

      var action_status = text; 

      if (action_status == 'Fixed'){ 

       console.log('Action Passed'); 

       break(); 
      } 
      else { 
       browser.sleep(30000); 
       browser.refresh(); 
      } 

      if (action_status == 'Failed' || action_status == 'Blocked'){ 

       console.log('Action Failed'); 
      } 
     }); 
    } 

웹 페이지는 각 JS로 작성하고 내가 각도기와 재스민 프레임 워크를 사용하여 테스트하려고 다음과 같이

코드입니다.

문제는 다음 에러 코드 :

오류 코드 : 100 신호가 수신 : NULL 셀레늄 서버 사용 http://localhost:4444/wd/hub 가 [기동] WebDriver 1 개 인스턴스 실행 [기동] 오류 장소 : 구문 에러 예기치 토큰

예기치 않은 토큰이 무엇인지 알 수 없습니까?

답변

2

우선 break()으로 전화하면 안되며 break;을 사용해야합니다.

후속 문제는 실제로 루프 안에 있지 않기 때문에 여기에 영향을주지 않을 것입니다 (글쎄, 코드를 위에서 아래로 읽으면 그렇습니다,하지만 우리는 에서 일합니다). 여기서는 비동기식 환경이며 약속 해결 함수 안에 있습니다. 따라서 SyntaxError: Illegal break statement 오류가 발생합니다. 루프의 코드가 비동기이기 때문에

it("should test something", function (done) { 
    browser.sleep(30000); 

    browser.refresh(); 

    for (var i = 0; i < 50; ++i) { 
     console.log('i is: ', i); 
     element(by.css('.deployment-card-status, result.status')).getText().then(function(text){ 
      var action_status = text; 
      if (action_status == 'Fixed'){ 
       console.log('Action Passed'); 
       done(); 
      } 
      else { 
       browser.sleep(30000); 
       browser.refresh(); 
      } 

      if (action_status == 'Failed' || action_status == 'Blocked'){ 
       console.log('Action Failed'); 
      } 
     }); 
    } 
}); 
+0

확인을, 당신이 제안 된 솔루션을 시도했다. 이제 이전 오류 대신에 오류가 표시됩니다. ** 굵게 [31m 오류 : 시간 초과 - jasmine.DEFAULT_TIMEOUT_INTERVAL에 지정된 시간 내에 비동기 콜백이 호출되지 않았습니다. [0m 스택 : 오류 : 시간 초과 - 비동기 콜백이되었습니다. jasmine.DEFAULT_TIMEOUT_INTERVAL에 의해 지정된 시간 제한 내에서 호출되지 않습니다. (object)]에서 ._ onTimeout (C : \ Users \ hk-sel1 \ e2e- 테스트 \ node_modules \ protractor \ node_modules \ jasmine \ node_modules \ jasmine-core \ lib \ jasmine-core \ jasmine.js : 1812 : 23) ** –

+0

또한 jasmine.DEFAULT_TIMEOUT_INTERVAL이 30000으로 설정되었지만 60000으로 늘리면 여전히 같은 오류가 발생합니다. –

+0

@HiteshKapur 예, 나는 거기에 더 많은 것이 있습니다. FlorentB는 for 루프를 사용하지 말아야한다는 것이 맞습니다. 당신은 그의 해결책을 시도 했습니까? 감사. – alecxe

1

당신은 for 루프를 사용하지 않아야은 "반환"의 종류 쟈스민 테스트에서 -는 done() 기능을 사용하는 것입니다 해결하기

한 가지 방법 . 당신은 Promises 다루고있는, 그래서 여기에 옳은 함수에 코드를 삽입하고 예상되는 상태를 얻을 때까지 다시 호출하는 것입니다 :

(function checkActionStatus(i) { 
    console.log('i is: ', i); 

    $('.deployment-card-status, result.status').getText().then((action_status) => { 

     // break if the status is Fixed or Failed or Blocked 
     if (/^(Fixed|Failed|Blocked)$/.test(action_status)) { 
      console.log('Action ', action_status); 
      return; 
     } 

     // wait, refresh and retry if the counter is not expired 
     if (++i < 50) { 
      browser.sleep(1000); 
      browser.refresh(); 
      checkActionStatus(i); 
     } 
    }); 

})(0);