2016-11-10 64 views
1

我用量角器,當我在browserstack運行我的測試中我收到以下錯誤量角器移動到下一個測試,而無需等待

StaleElementReferenceError: stale element reference: element is not attached to the page document 

,或者根據我在beforeAll

Error: Index out of bound. Trying to access element at index: 0, but there are only 0 elements that match locator By.cssSelector ... 

這裏是代碼片段會導致錯誤:

describe('...',() => { 
    it('...',() => { 
     expect(element.all(by.css(...)).count()).toBe(9); 
     expect(element.all(by.css('.items').get(0).isDisplayed()).toBeTruthy(); 
    }); 
} 

describe('',() => { 
    beforeAll((/* done */) => { 
     element(by.css('.go-home').click(); // .then(done); 
     //browser.driver.get('/');//.then(done); 
    }); 
    ... 
}); 

對於原因beforeAll繼續並更改網址,而以前的it仍在運行(我猜根據錯誤)。

現在,我設法破解這樣的工作。我已經添加了doneit如下

describe('...',() => { 
    it('...', (done) => { 
     expect(element.all(by.css(...).count()).toBe(9); 

     element.all(by.css(...)).get(0).isDisplayed().then((state) => { 
      expect(state).toBeTruthy(); 
      done(); 
    }); 
    }); 
} 

describe('',() => { 
    beforeAll(() => { 
     element(by.css('.go-home').click(); // works 
     //browser.driver.get('/');   // still fails 
    }); 
    ... 
}); 

現在,它的工作原理。但是,如果我使用browser.driver.get('/')它再次失敗。

通常我不需要將done添加到我的it s所以我的問題是:這裏發生了什麼問題?任何幫助,將不勝感激

UPDATE:protractor.config.js:

exports.config = { 
    chromeDriver: '../node_modules/protra...medriver_2.25', 
    seleniumServerJar: '../node_...-server-standalone-2.53.1.jar', 
    exclude: [], 

    specs: [ 
     '../test/e2e/**/*.js' 
    ], 

    multiCapabilities: [ 
     { 
      build: 'test', 
      project: 'ABC', 
      browserName: 'firefox', 
      //browserName: 'chrome', 
      os: 'Windows', 
      os_version: '10', 
      directConnect: true 
     }], 
    debug: true, 
    maxSessions: 1, 
    framework: 'jasmine2', 

    onPrepare: function() { 
     browser.driver.manage().window().setSize(1024, 768); 

     // Register helpers 
     require('../test/framework/jasmine2'); 

     var disableNgAnimate = function() { 
      angular 
       .module('disableNgAnimate', []) 
       .run(['$animate', function ($animate) { 
        $animate.enabled(false); 
       }]); 
      }; 

     var disableCssAnimate = function() { 
      angular 
       .module('disableCssAnimate', []) 
       .run(function() { 
        var style = document.createElement('style'); 
        style.type = 'text/css'; 
        style.innerHTML = '* {' + 
         '-webkit-transition: none !important;' + 
         '-moz-transition: none !important' + 
         '-o-transition: none !important' + 
         '-ms-transition: none !important' + 
         'transition: none !important' + 
         '}'; 
        document.getElementsByTagName('head')[0].appendChild(style); 
      }); 
     }; 

     browser.addMockModule('disableNgAnimate', disableNgAnimate); 
     browser.addMockModule('disableCssAnimate', disableCssAnimate); 
    } 
}; 

回答

2

我明白then() -Functionality的方式,它啓動一個異步任務。因此,只要輸入then()then()-函數外的任何代碼行都將繼續。 閱讀更多關於hereherehere

在承諾解析方面,browser.get()browser.driver.get()還存在幾個挑戰,因爲目前尚不清楚加載頁面是否可以與ControlFlow同步。因此browser.driver.get()並不總是強制量角器等待。 閱讀更多關於herehere

您的測試現在結合了這兩個問題。

我建議嘗試在您的解決方案browser.waitForAngular();觸發量角器實際上等到所有的承諾都解決了:

describe('...',() => { 
    it('...',() => { 
     expect(element.all(by.css(...).count()).toBe(9); 

     element.all(by.css(...)).get(0).isDisplayed().then((state) => { 
      expect(state).toBeTruthy(); 
     }); 
     //instead of using done to explicitly announce the "function finished" 
     //use browser.waitForAngular() to let Protractor wait for any promises to be resolved. 
     browser.waitForAngular(); 
    }); 
} 

describe('',() => { 
    beforeAll(() => { 
     // .click() returns a promise, so Protractor waits for it to be resolved 
     //element(by.css('.go-home').click(); 
     browser.driver.get('/'); // doesn't return a promise 
     browser.waitForAngular(); // triggers Protractor to wait for $http and promises resolved. 
    }); 
    ... 
}); 
+0

感謝您指出了這一點。不幸的是,我不能再檢查了,因爲我已經轉向Angular :) –

相關問題