【问题标题】:Protractor Async/Await Error: Unhandled promise rejection量角器异步/等待错误:未处理的承诺拒绝
【发布时间】:2018-09-11 23:32:07
【问题描述】:

我正在使用量角器 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();    

【问题讨论】:

    标签: javascript angularjs async-await jasmine protractor


    【解决方案1】:

    错误清楚地表明CustomerSelection.js 中的承诺拒绝未被处理。根据堆栈跟踪,await element(by.xpath(...)) 未能解决承诺。

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

    默认情况下,每个带有async 关键字的方法的返回类型都是一个promise。因此,您应该在Scenario_01.js: 中等待customer.cusSelection(),或者使用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 rejectionsuncaughtException 错误类似地处理。

    这意味着即将推出的节点版本将在遇到 Promise 拒绝 (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(); 
    

    【讨论】:

    • 谢谢朋友。现在似乎正在取得进展,尽管在尝试单击“await element.all(by.css('ul[class^="ui-autocomplete"]')).first( )。点击();” CustomerSelection.js 中的元素。 “等待”不是在寻找元素之前等待元素可见吗?也尝试了 1500 毫秒的睡眠。没有等待/异步设置,一切正常。您能否建议如何解决这个问题?
    • 我不是很擅长 jasmine 和量角器,但是你能在变量中捕获await element.all(by.css('ul[class^="ui-autocomplete"]')) 的结果,然后使用variable.first().click() 来触发点击事件吗?我猜element.all(by.css('ul[class^="ui-autocomplete"]')) 在这里返回了一个承诺。
    • 试图计算和打印数组中的元素,我可以看到值是 '1',这是预期的,让 autocompleteElem = await element.all(by.css('ul[class^= "ui-autocomplete"]')).then(function(counter){console.log("No.Of Values:" +counter);});.但是,最终出现错误:“TypeError:无法读取属性” first' of undefined" 如果我​​尝试单击第一个元素。"let autocompleteElem = await element.all(by.css('ul[class^="ui-autocomplete"]')).then(function() {autocompleteElem.first().click();});"有什么注意事项吗?
    • 你不应该同时使用 await 和 then 。我将使用新代码更新我的答案。尝试使用它,让我知道它是否有效。
    • 运气不好,伙计。以以下错误结束。 TypeError: elements.first is not a function at customer.cusSelection (C:\Users\Ashish\Documents\Protractor\scripts\CustomerSelection.js:11:22) at at process._tickCallback (internal/process/next_tick. js:188:7)
    猜你喜欢
    • 2018-10-11
    • 2019-02-21
    • 2020-03-22
    • 1970-01-01
    • 2019-10-27
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多