2014-11-17 7 views
1

필자는 전제 조건 (사용자 생성을 생각하십시오)을 설정하기 위해 라이브러리를 가져 오는 것으로 놀고 있습니다. 분도기는 약속 기반이고 magically does all the wrapping to keep things in order이므로, 나는 그 목적을 위해 약속을 사용하는 것을 생각했습니다. 약간의 샘플 코드를 작성했지만 관찰 된 동작을 설명 할 수 없기 때문에 누군가가 내가 무슨 일이 일어나는지 이해할 수 있도록 도와 줄 수 있습니다. 분도기 사용 약속 이해하기

function timeout(ms) { 
    var promise = protractor.promise.defer(); 
    setTimeout(function() { 
     console.log('qwer'); 
     promise.fulfill(true); 
    }, ms); 
    return promise.promise; 
} 

는 이제 함수는 (모든 코드는 가정으로 제어 흐름에 싸여지기로) 난 그냥과 같이 사용할 수있는 인라인으로 가정 할 약속,

describe('test', function() { 
    it('bla', function() { 
    browser.get('/'); 
    timeout(5000); 
    $('some-element').click(); 
    }); 
}); 

그러나이하지 않습니다를 반환 예상대로 작동합니다 (예 : console.log가 발생하지 않음). 해당 약속의 결과가 expect 인 경우에도 결과는 변경되지 않습니다. timeout(5000).then(done)을 수행하여 실제로 명시 적으로 대기하는 경우 제한 시간은 완료되지만 해당 작업 (사이트가 열리고 요소가 클릭 된 후 5 초 후 제한 시간의 로그가 발생 함) 이후에 다음 작업이 대기열에 저장되지 않습니다.

그래서 모든 것이 순서대로 실행되고 관찰 된 동작이 함께 맞춰 지도록 제어 흐름을 사용한다고 주장하는 것이 정말 혼란 스럽습니다.

답변

4

protractor.promise 지연 개체를 만드는 것만으로는 충분하지 않습니다. 제어 흐름을 알려야합니다. 이것은 보통 protractor.promise.controlFlow().execute()으로 이루어집니다.

function timeout(ms) { 
    protractor.promise.controlFlow().execute(function() { 
    var deferred = protractor.promise.defer(); 
    setTimeout(function() { 
     console.log('qwer'); 
     deferred.fulfill(true); 
    }, ms); 
    return deferred.promise; 
    }); 
} 

여기에있는 모든 마법에 대해 https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js을 통해 읽습니다.

+0

단지 두 달 후 나는 마침내 당신의 솔루션을 보았습니다. 그리고 그것은 작동합니다 ('''controlFlow()''')를 써야한다는 것을 제외하고). 정말 고마워 :) – FrankyBoy