我已经在寻找警告的解决方案已有好几个星期了,我看起来是一个令人沮丧的github或stackoverflow主题,但是解决方案却给我带来了永远的和平或短暂的平静。所以我打开了这个话题,请别对我生气,我被困住了。
我正在AngularJs中编写异步等待的e2e测试。
我通过以下方式取消了控制流:SELENIUM_PROMISE_MANAGER: false
这是我的登录名。用于测试登录页面的规范测试文件:
var LoginPage = require('../pages/login.page.js');
describe('Testing Login Page', function (){
const EC = protractor.ExpectedConditions;
var loginPage = new LoginPage();
beforeAll(async () => {
await loginPage.get().catch((e)=>{
console.log(e);
})
await loginPage.login().catch((e)=>{
console.log(e);
})
});
it('there should be user name and user password area',async () => {
expect(await $('[ng-model="user.name"]').isPresent()).toBe(true);
expect(await $('[ng-model="user.password"]').isPresent()).toBe(true);
});
it('there should be login button',async () => {
expect(await $('[test-id="loginSubmit"]').isPresent()).toBe(true);
});
});
这是我用于获取和登录功能的login.page.js:
let LoginPage = function(){
const EC = protractor.ExpectedConditions;
this.get = async ()=>{
await browser.get(`${browser.baseUrl}`);
await browser.wait(
EC.presenceOf(element(by.css('.container.login'))), 30000,
'Waiting too long to open login page'
)
}
this.login=async ()=>{
await $('[ng-model="user.name"]').clear().sendKeys(browser.params.login.user);
await $('[ng-model="user.password"]').clear().sendKeys(browser.params.login.password);
const loginSubmit = await $('[test-id="loginSubmit"]');
await loginSubmit.click();
}
}
module.exports = LoginPage;
这是我在protractor.config.js中的导出配置部分:
framework: 'jasmine',
specs: ['../test/e2e/specs/*Spec.js'],
SELENIUM_PROMISE_MANAGER: false,
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 900000 //for timeout error: timed out after 30000 msec waiting for spec to complete
},
getPageTimeout: 900000, //for Error: Timed out waiting for page to load after 10000ms
//for Error: Angular could not be found on the page: retries looking for angular exceeded
allScriptsTimeout: 900000, //for Error: Timed out waiting for asynchronous Angular tasks to finish after 11 seconds.
//for ScriptTimeoutError: asynchronous script timeout: result was not received in 11 seconds
multiCapabilities: [{
browserName: 'chrome',
chromeOptions: {
args: ["--window-size=1368,700" ]
}
}],
onPrepare: ()=>{
jasmine.getEnv().addReporter(new HtmlReporter({
baseDirectory: 'test/e2e/results/',
screenshotsSubfolder: 'images',
jsonsSubfolder: 'jsons',
takeScreenShotsOnlyForFailedSpecs: true,
preserveDirectory: false,
docName: 'index.html' ,
cssOverrideFile: 'https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'
}).getJasmine2Reporter());
},
这是package.json中测试包的版本:
"jasmine": "^3.0.0",
"jasmine-core": "^3.0.0",
"jasmine-reporters": "^2.0.0",
"jquery": "^3.2.1",
"karma": "^2.0.0",
"karma-chrome-launcher": "^2.2.0",
"karma-jasmine": "^1.1.1",
...
"protractor": "^5.4.0",
"protractor-beautiful-reporter": "^1.1.1",
...
最后是我的错误。我运行e2e,在一切都给我这个错误之前,然后使硒开始了:
.. [10:43:11]我/更新-chromedriver:解压缩chromedriver_2.42.zip (节点:17016)UnhandledPromiseRejectionWarning:错误:EPERM:操作 不允许,重命名 'C:\ ProjectPath \ node_modules \ protractor \ node_modules \ webdriver-manager \ selenium \ chromedriver.exe' ->'C:\ ProjectPath \ node_modules \ protractor \ node_modules \ webdriver-manager \ selenium \ chromedriver_2.42.exe' 在Object.fs.renameSync(fs.js:766:18) 解压缩时(C:\ ProjectPath \ node_modules \ protractor \ node_modules \ webdriver-manager \ built \ lib \ cmds \ update.js:235:8) 在files_1.FileManager.downloadFile.then。然后下载(C:\ ProjectPath \ node_modules \ protractor \ node_modules \ webdriver-manager \ built \ lib \ cmds \ update.js:205:13) 在 在process._tickCallback(内部/进程/next_tick.js:188:7)(节点:17016)UnhandledPromiseRejectionWarning:未处理的承诺 拒绝。该错误是由抛出异步内部引起的 没有捕获块或拒绝承诺 未使用.catch()处理。 (拒绝ID:1)(节点:17016)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。在 未来,未处理的承诺拒绝将终止 使用非零退出代码的Node.js进程。 引用
好吧,我尝试在每次测试后都放置catch块,但这似乎并不好,并且没有得到解决方案。 我曾经使函数处于异步状态,并在每条语句等待之前放置。 我试图在beforeAll代码块中删除browser.wait(),但是它也没有起作用,所以我将其取回。
我的意思是说我的测试运行成功,有时甚至根本没有得到这个警告。但是我什么也没改变,但它一直给我这个错误。
如何防止未处理的承诺被拒绝?