2016-06-14 5 views
2

browser.wait(...)을 통해 특정 요소가 있는지 확인하고 각도가 element1.isPresent() 인 검사기를 작성하려고합니다. 그럴 경우 다른 요소가 있는지 확인하고 싶습니다. element2.isPresent().각도기가 불필요하게 대기합니다.

정확하게 element1element2 중 하나가 있어야하며 둘 다 같지 않으면 테스트가 실패하기를 원합니다.

내 코드는 다음과 같습니다

var element1 = element(by.id('test-elem1')); 
var element2 = element(by.id('test-elem2')); 
browser.wait(function() { 
    return element1.isPresent(); 
}, 5000, "Waiting for element 1").then(function() { 
    console.log('Found element 1'); 
    // Do something with element 1 
}, function() { 
    // Element 1 not present --> look for element 2 
    browser.wait(function() { 
     return element2.isPresent(); 
    }, 5000, "Waiting for element 2"); 
    print('Found element 2'); 
}); 

내가 기대하는 것은 : element1가 존재

  • 경우 그 .then 가야하므로, 다음 첫 번째 browser.wait는 성공 약속 마무리합니다 첫 번째 함수에 넣고 Found element 1을 인쇄하십시오.
  • 그러나 element1이없는 경우 첫 번째 browser.wait은 실패로 끝날 것이므로 .thenelement2을 찾는 두 번째 기능으로 이동해야합니다. 그런 다음 element2이 있으면 테스트를 계속하고 Found element 2을 인쇄 한 다음 통과해야합니다. 그러나 element2이 없으면이 초에 실패하므로 browser.wait이므로 테스트가 실패해야합니다.

element1이없는 경우 첫 번째 browser.wait은 실패하고 테스트를 실패하게 만듭니다. element1이 있으면 나머지 테스트는 예상대로 계속됩니다.

.then()에 대한 두 번째 매개 변수가 정의 된 경우 실패한 경우 두 번째 함수가 완전히 실패하지 않고 호출되어야한다는 인상을 받았습니다.

다른 곳에서 작업 한 코드가 거의 동일하므로 (내가 삭제 한 이후로 더 이상 참조 할 수 없기 때문에)이 부분이 작동하지 않는 이유를 모르겠습니다.

왜 이런 일이 발생합니까? 난 그냥 예상 약관을 사용

답변

3

built-in or operator이 : 두 요소가 존재하지 않는 달리 전달하면이 실패

var EC = protractor.ExpectedConditions; 
var element1 = element(by.id('test-elem1')); 
var element2 = element(by.id('test-elem2')); 

browser.wait(EC.or(EC.presenceOf(element1), EC.presenceOf(element2)), 5000); 

.


이제 초기 코드에 어떤 일이 일어나고 있는지 이해하려고합시다.

첫 번째 문제는 browser.wait()의 첫 번째 인수가 함수 여야한다는 것입니다. 죄송합니다,

var element1 = element(by.id('test-elem1')); 
var element2 = element(by.id('test-elem2')); 

browser.wait(function() { 
    return element1.isPresent(); 
}, 5000).then(function() { 
    console.log('Found element 1'); 
}, function() { 
    // Element 1 not present --> look for element 2 
    browser.wait(function() { 
     return element2.isPresent(); 
    }, 5000).then(function() { 
     print('Found element 2'); 
    } 
}); 
+0

오 : 또한, 두 번째 browser.wait() 호출의 then() 콜백에 두 번째 console.log() 통화를 보류해야한다. 실제로 문자열을 먼저 가져온 래퍼를 사용했기 때문에 첫 번째 인수를'browser.wait'에 문자열로 남겨 두었습니다. 나는 내 질문을 쓸 때 그것을 잊었다. – Jashaszun

+0

또한 'element1'또는 'element2'를 찾았는지에 따라 다른 작업을 수행해야합니다. 아직 예상 조건을 사용해야합니까? – Jashaszun

+0

@Jashaszun 글쎄, 당신은 여전히 ​​그들을 기다릴 수 있지만, 다음에'isPresent()'를 추가적으로 실행한다. 또는 현재 접근법을 고수 할 수 있습니다 (현재 작동한다고 가정) .. btw를 사용하면 함수를 'EC.presenceOf' 호출로 바꿀 수 있습니다. 감사. – alecxe

관련 문제