量角器无需等待即可继续下一个测试
Protractor moves on to next test without waiting
我正在使用量角器,当我 运行 在 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
继续并更改了 url,而之前的 it
仍然是 运行ning(我猜是基于错误)。
现在,我设法解决了这个问题。我已将 done
添加到 it
,如下所示
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
中,所以我的问题是:这里出了什么问题?任何帮助将不胜感激
更新: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);
}
};
根据我对 then()
功能的理解,它会启动一个异步任务。因此,一旦输入 then()
,then()
函数之外的任何代码行都将继续。
详细了解 , and here。
browser.get()
和 browser.driver.get()
在 promise-resolving 方面还存在一些挑战,因为尚不清楚要加载的页面是否可以与 ControlFlow 同步。因此 browser.driver.get()
并不总是迫使 Protractor 等待。
详细了解 here and here
您的测试现在以某种方式结合了这两个问题。
我建议在您的解决方案中尝试 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.
});
...
});
我正在使用量角器,当我 运行 在 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
继续并更改了 url,而之前的 it
仍然是 运行ning(我猜是基于错误)。
现在,我设法解决了这个问题。我已将 done
添加到 it
,如下所示
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
中,所以我的问题是:这里出了什么问题?任何帮助将不胜感激
更新: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);
}
};
根据我对 then()
功能的理解,它会启动一个异步任务。因此,一旦输入 then()
,then()
函数之外的任何代码行都将继续。
详细了解
browser.get()
和 browser.driver.get()
在 promise-resolving 方面还存在一些挑战,因为尚不清楚要加载的页面是否可以与 ControlFlow 同步。因此 browser.driver.get()
并不总是迫使 Protractor 等待。
详细了解 here and here
您的测试现在以某种方式结合了这两个问题。
我建议在您的解决方案中尝试 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.
});
...
});