量角器异步/等待错误:未处理的承诺拒绝

时间:2018-09-11 07:59:31

标签: javascript angularjs async-await jasmine protractor

我正在使用量角器Async / Await重构我的框架,以避免在整个代码库中出现草率的browser.sleep()。

下面是测试步骤,然后以代码为例:

Opens ChromeBrowser
Logins with the credentials
Selects a customer
Clicks on "Manage Customer" button.

能否请您帮我解决以下错误:

Report destination:   target\e2e\screenshots\my-report.html
[12:42:21] I/launcher - Running 1 instances of WebDriver
[12:42:21] I/hosted - Using the selenium server at http://127.0.0.1:4444/wd/hub

(node:18208) UnhandledPromiseRejectionWarning: Error: Error while waiting for Protractor to sync with the page: "both angularJS testability and angular testability are undefined.  This could be either because this is a non-angular page or because you
r test involves client-side navigation, which can interfere with Protractor's bootstrapping.  See http://git.io/v4gXM for details"
    at runWaitForAngularScript.then (C:\Users\Ashish\AppData\Roaming\npm\node_modules\protractor\built\browser.js:463:23)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)Error
    at ElementArrayFinder.applyAction_ (C:\Users\Ashish\AppData\Roaming\npm\node_modules\protractor\built\element.js:459:27)
    at ElementArrayFinder.(anonymous function).args [as sendKeys] (C:\Users\Ashish\AppData\Roaming\npm\node_modules\protractor\built\element.js:91:29)
    at ElementFinder.(anonymous function).args [as sendKeys] (C:\Users\Ashish\AppData\Roaming\npm\node_modules\protractor\built\element.js:831:22)
    at customer.cusSelection (C:\Users\Ashish\Documents\Protractor\scripts\CustomerSelection.js:7:50)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
(node:18208) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:18208) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
[12:42:25] I/launcher - 0 instance(s) of WebDriver still running
[12:42:25] I/launcher - chrome #01 passed

下面是Conf.js,Scenario_01.js和相应的模块,供您参考:

Conf.js:

var HtmlScreenshotReporter = require('protractor-jasmine2-screenshot-reporter');
var reporter = new HtmlScreenshotReporter({
  dest: 'target/e2e/screenshots',
  filename: 'my-report.html',
  ignoreSkippedSpecs: true,
  reportOnlyFailedSpecs: false,
  captureOnlyFailedSpecs: true  ,
  showSummary: true,
  showQuickLinks: true,
  showConfiguration: true,
  reportTitle: "Protractor Automation Report",
  reportFailedUrl: true,
  inlineImages: true,
});

exports.config = {
seleniumAddress: 'http://127.0.0.1:4444/wd/hub',

suites: {
    Scenario1: './Scenario_01.js', 
},

SELENIUM_PROMISE_MANAGER: false,

capabilities: {
    'shardTestFiles': false,
    'maxInstances': 1,
    'browserName': 'chrome',
    'chromeOptions': {
     'args': ['disable-extensions', 'start-maximized']  //'--headless',
    }
},
allScriptsTimeout: 11000,
getPageTimout: 10000,
restartBrowserBetweenTests: false,
framework: 'jasmine2',
jasmineNodeOpts: {
    onComplete: null,
    isVerbose: true,
    showColors: true, // is True, prints colors to terminal
    includeStackTrace: true,
    defaultTimeoutInterval: 30000, 
    print: function () {}
},
beforeLaunch: function() {
    return new Promise(function(resolve){
    reporter.beforeLaunch(resolve);
    });
},

onPrepare: function () {

    jasmine.getEnv().addReporter(reporter);
    browser.manage().window().maximize();
    browser.manage().timeouts().implicitlyWait(5000);
    jasmine.getEnv().addReporter( new Jasmine2HtmlReporter({savePath: 'target/screenshots'}));
}
};

Scenario_01.js:

describe('Scenario_01', function() {

 var common = require('./scripts/CloseBrowsers.js');    
 var Login = require('./scripts/Login.js'); 
 var customer = require('./scripts/CustomerSelection.js');

 it('Login', function() {
         browser.waitForAngularEnabled(false); 
         Login.login('admin','Adminpwd');
     });

     it('CustomerSelection', function() {
         browser.waitForAngularEnabled(true);
         customer.cusSelection();
     });

afterAll(function(){
    common.closeBrowsers();
});
});

Login.js:

var Login = function() {

     this.login = async function(username, passwordKey){
     await browser.get('http://testwebsite.com/showCust');
     await element(by.name('USER')).sendKeys(username);
     await element(by.name('PASSWORD')).sendKeys(passwordKey);
     await element(by.xpath('/html/body/table/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr[3]/td/form/input[9]')).click();
     await element(by.name('YES')).click();
     //browser.sleep(10000);

};
}
module.exports = new Login();

CustomerSelection.js:

var customer = function(){

    this.cusSelection = async function(){

     await element(by.css(['ng-model="selectedChannel.selected"']));
     await element(by.id('customer-auto-complete')).sendKeys('TestCustomer');
     //browser.sleep(500);

     await element.all(by.css('ul[class^="ui-autocomplete"]')).first().click();
    //browser.sleep(1500);
     await element(by.partialButtonText('Manage Customer')).click();
     browser.sleep(10000);      
    };
}
module.exports = new customer();    

1 个答案:

答案 0 :(得分:2)

该错误明确表明未处理CustomerSelection.js中的拒绝承诺。根据堆栈跟踪,await element(by.xpath(...))无法解决承诺。

解决此问题的方法是在customer.cusSelection()中捕获Scenario_01.js:并在那里处理异常。

默认情况下,每个带有async关键字的方法的返回类型都是promise。因此,您应该在customer.cusSelection()中的Scenario_01.js:上等待,或者使用then-catch子句进行断言。

类似的东西-

 it('CustomerSelection', async function() {
     browser.waitForAngularEnabled(true);
     let response = await customer.cusSelection();
 });

 // OR this to catch exceptions.

 it('CustomerSelection', function() {
     browser.waitForAngularEnabled(true);
     customer.cusSelection()
        .then(response => console.log(response))
        .catch(error => console.error(error));
 });

Node.js今后将朝着与unhandled promise rejections错误类似的方式处理uncaughtException

这意味着即将到来的节点版本将在遇到承诺拒绝(reference)时终止该过程。

  

更新- CustomerSelection.js

的代码段
var customer = function(){

    this.cusSelection = async function(){

    await element(by.css(['ng-model="selectedChannel.selected"']));
    await element(by.id('customer-auto-complete')).sendKeys('TestCustomer');
    //browser.sleep(500);

    // updating this snippet
    // await element.all(by.css('ul[class^="ui-autocomplete"]')).first().click();

    // to following
    let elements = await element.all(by.css('ul[class^="ui-autocomplete"]'));
    elements.first().click();

    //browser.sleep(1500);
    await element(by.partialButtonText('Manage Customer')).click();
    browser.sleep(10000);      
    };
}
module.exports = new customer();