config.js
exports.config = {
framework: 'jasmine',
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: [
'Login.js',
'FeatureList.js',
'NewApplicationRegistration.js',
'ApplicationRegistrationManagement.js',
'RegistrationStatus.js',
],
baseUrl: 'http://localhost:3000',
multiCapabilities: [{
'browserName': 'chrome'
},
// {
// 'browserName': 'firefox'
// },
// {
// 'browserName': 'internet explorer'
// }
],
jasmineNodeOpts: {
onComplete: null,
isVerbose: false,
showColors: true,
includeStackTrace: true,
defaultTimeoutInterval: 3000000
},
allScriptsTimeout: 11000,
rootElement: 'html',
onPrepare: function () {
browser.ignoreSynchronization = true;
browser.driver.manage().window();
},
};
第一个规范文件
'use strict'
describe('Application Registration Page', function () {
beforeEach(function () {
browser.waitForAngular();
browser.get('/register');
});
// Login
it('Test for Login', function () {
expect(element(by.xpath('/html/body/admin-app-root/layout/div[1]/div/ng-component/div/form/div/table/tbody/tr[1]/th/label')));
var EC = protractor.ExpectedConditions;
var username = element(by.id('login-username'));
browser.wait(EC.visibilityOf(username), 30000);
username.sendKeys('sss');
expect(element(by.xpath('/html/body/admin-app-root/layout/div[1]/div/ng-component/div/form/div/table/tbody/tr[2]/th/label')));
var EC = protractor.ExpectedConditions;
var password = element(by.id('login-password'));
browser.wait(EC.visibilityOf(password), 30000);
password.sendKeys('sss');
browser.driver.sleep(1000);
element(by.xpath('/html/body/admin-app-root/layout/div[1]/div/ng-component/div/form/div/table/tbody/tr[3]/td/button')).click().then(function (username, password) {
if (username, password) {
browser.navigateTo('http://localhost:3000/register/core/feature-list');
} else {
expect(browser.isElementPresent(element(by.xpath('/html/body/admin-app-root/layout/div[1]/div/ng-component/div/form/div/table/tbody/tr[1]/td/b'))));
}
});
});
});
第二条规范
'use strict'
describe('Welcome to feature list', function () {
beforeEach(function () {
browser.waitForAngular();
browser.get('/register/core/feature-list');
});
describe('Header', function () {
// Application Registration text
it('Test for Application Registration text', function () {
var EC = protractor.ExpectedConditions;
var ar = element(by.xpath('/html/body/admin-app-root/layout/div[1]/c-header/nav/div/div[1]/a[2]'));
browser.wait(EC.presenceOf(ar), 2000000);
expect(ar.getAttribute('value')).toEqual('Application Registration');
});
it('Test for user name', function () {
var EC = protractor.ExpectedConditions;
var username = element(by.xpath('//*[@id="cox-navbar"]/ul/li[1]/a'));
browser.wait(EC.visibilityOf(username), 2000);
expect(username.isPresent()).toBe(true);
});
});
第一个规范脚本运行正常,但运行第二个规范我收到错误说:
2000000ms后等待超时
即使脚本超时非常大,也会出现错误。对于给定的时间,它无法从浏览器中找到元素。
帮我找到解决方案。
答案 0 :(得分:0)
非常简短的答案:让你的量角器工作而不使用ignoreSynchronization
来避免这些问题。我将在下面详细说明您的问题,从您明确提出的问题开始。
在第二个规范上获得超时的原因
EC.presencesOf()隐式调用waitForAngular read more about it here
因为您ignoreSynchronization = true
调用了waitForAngular
次(因为您忽略了AngularSynchronization量角器无法识别presenceOf对象)。因为你间接称它为超时。
如果您在不知道其后果的情况下使用ignoreSynchronization
,那就没有意义了。原因非常有限,为什么要使用它。
您的第一个规范没有ignoreSynchronization
鉴于您的XPath查询,对我来说,Angular-Root-Element
似乎不是body
,而是admin-app-root
。因此,请尝试将rootElement: body
中的config.ts
更改为rootElement: admin-app-root
。 (作为一个可能的根本原因,为什么你的量角器不能很好地适应你正在测试的Angular页面。)
配置调整后:如果您仍然获得超时或缺少可测试性,请进一步check this answer。
同时降低timeout
元素的ar
2000000。我认为,这么长的超时几乎永远不会有意义,因为之前许多其他超时(web-timeout,jasmine-timeout,进一步的webdriver-timeouts等)。
更多建议和信息
global.EC = protractor.ExpectedConditions;
放入onPrepare:
的{{1}}部分,因此您无需将其添加到每个测试用例中。conf.js
部分的步骤,否则您的测试可能会提前开始(请参阅this documentation和a simple example here)onPrepare:
命令不会创建承诺,您应该在browser.get()
部分放置browser.waitForAngular()
以确保您的测试仅在您的网页完全加载后开始。 beforeEach
,如果您知道自己测试了需要它的特定情况。例如,如果您在加载过程中明确尝试验证某些内容,那么在处理异步任务时(即测试阻塞元素的外观)。 Learn about the purpose of ignoreSynchronization
here。ignoreSynchronization
。如果您处理Angular页面,首先尝试调试Protractor无法同步的原因。 Learn about these possibilities here 答案 1 :(得分:0)
@amit尝试在before之前使用promise,如下所示:
beforeEach(function () {
browser.waitForAngular().then(funtion(){
return browser.get('/register/core/feature-list');
}).then(function(){
console.log(browser.getCurrentUrl()) // ensure you are on correct url
})
});
它应该有用。