2017-11-10 13 views
0

AngularJS 앱용 테스트 제품군을 개발 중이며 다음 중 하나를 쓰는 동안 이상한 문제가 발생했습니다. 내가 해결할 수없는 테스트 스크립트.각도기로 AngularJS 테스트 - '정의되지 않은'요소가 이미 사용 된 경우에도 정의되지 않은 'click()'속성을 읽을 수 없음

테스트입니다 : 내가 테스트를 실행하면

it('should navigate to the Charts page', function() { 
    console.log("Start Charts page test"); 
    browser.waitForAngularEnabled(false); 
    browser.wait(EC.elementToBeClickable(chartsMenuBtn), 5000).then(
     browser.actions(). 
     mouseMove(chartsMenuBtn). 
     chartsMenuBtn.click(). 
     browser.wait(EC.urlIs(site + '/#/charts'), 5000). 
     perform() 
    ); 
}) 

, 그것은 이유를주고, 실패

Failed: Cannot read property 'click' of undefined

click()가 호출되고 있다는 요소는 내가 정의 chartsMenuBtn입니다

전 세계적으로 :

var chartsMenuBtn = element(by.linkText("Charts")); 

따라서 요소가 명확하게 정의됩니다. 그 중 Protractor는 click()에 대한 호출이 호출 된 시점에서 정의되지 않았다고 생각하는 것 같습니다. 실제로 실제로 바로 두 번 앞에 사용 되었기 때문에 각도기가 주장하는 지점에서 정의되지 않은 경우 그것은 두 가지 이전 용도에서도 분명히 정의되지 않았을 것입니다 ...?

chartsMenuBtn: ElementFinder { 
browser_: 
ProtractorBrowser { 
    controlFlow: [Function], 
    schedule: [Function], 
    setFileDetector: [Function], 
    getExecutor: [Function], 
    getSession: [Function], 
    getCapabilities: [Function], 
    quit: [Function], 
    actions: [Function], 
    touchActions: [Function], 
    executeScript: [Function], ... 

요소가 명확하게 정의되어 있음을 보여주는 : 내 콘솔에서 다음

는 사실은 그냥 정의되지 않은 아니라는 것을 확인하기 위해, 직전 browser.wait(EC.elementToBeClickable(chartsMenuBtn), 5000).then( 라인에 browser.call(console.log("chartsMenuBtn: ", chartsMenuBtn)); 라인을 넣어, 이것은 인쇄 그것이 사용되는 시점에서.

누구나이 테스트가 실패한 실제 이유는 무엇입니까? 올바르게 실행하려면 어떻게해야합니까?

+0

나는 각도기를 모르지만 코드에서 "click()"은 "chartsMenuBtn"변수가 아니라 "chartsMenuBtn"이지만 mouseMove (chartsMenuBtn)의 반환 값 속성입니다. 당신은 끝으로 문장을 끝내고 세미콜론은 끝내지 않습니다. – Pablo

+0

아, 그래, 내가 그 약속을 잘못 묶어 놓고있는 것 같아. 나는 당신이 제안한 것을 제공했지만, 이제는 오류 메시지 : '실패 : 알 수없는 오류 : 요소 ....'가 포인트 (40, 229)에서 클릭 가능하지 않습니다. 다른 요소는 클릭을 수신합니다. 그것은 버튼이 아니라 대화 상자 (내가 클릭하려고하는 버튼이 표시된 대화 상자)에 의해 클릭이 수신되었음을 나타냅니다 ... – someone2088

+0

말한 것처럼 나는 각도기를 모르지만, 그러나 약속이 있다면 다음과 같이 할 필요가 있습니다. mouseMove (chartsMenuBtn) .then (function() {return chartsMenuBtn.click();}). then (function() {return browser.wait (EC.urlIs (사이트 + '/ #/차트'), 5000); }). perform();' – Pablo

답변

2

의견에서 이미 지적한대로 then()가 조금 이상해 보입니다. 또한 실제로 귀하의 경우에는 필요하지 않습니다. 여기

내 제안 :

it('should navigate to the Charts page', function() { 
    console.log("Start Charts page test"); 
    browser.waitForAngularEnabled(false); 
    browser.wait(EC.elementToBeClickable(chartsMenuBtn), 5000); 
    //browser.wait(EC.invisibilityOf(blockingElement), 5000); 
    chartsMenuBtn.click(); //works, if the element is defined as you said 
    browser.wait(EC.urlIs(site + '/#/charts'), 5000); 
}) 

하면 (당신이 말한대로)를 click()는, browser.wait(EC.invisibilityOf(blockingElement), 5000)을 수행하려고 할 때 버튼이 클릭 할 수 없습니다.

"isNotClickable"메시지가 "정의되지 않은 속성을 읽을 수 없습니다"보다 덜 잘못되었습니다. "isNotClickable"은 유효한 코드라고 말하지만 웹 페이지에서는 현재이 작업을 수행 할 수 없습니다. "속성을 읽을 수 없습니다"는 말하지만 코드가 잘못되었습니다.

일반적으로 the Protractor API here을 선택하면 일반적으로 해결책을 찾을 수 있습니다. 모든 유용한 명령이 여기에 나열됩니다.