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

时间:2018-05-01 17:02:44

标签: angularjs node.js asynchronous promise protractor

所以我使用async / await(Link)迁移我的量角器测试。

到目前为止,迁移有些成功,直到我继续遇到这个问题。 以下是我的测试步骤,然后是代码,作为我正在处理的内容的一个例子:

  • 导航到特定页面
  • 改变背景(将学校改为高中)
  • 抓住高中的房间清单
  • 再次改变背景(将学校改为中学)
  • Grab中学房间列表
  • 比较两个列表

以上步骤的相关代码:

  

Test.ts

await browser
      .switchTo()
      .frame(element(by.tagName("iframe")).getWebElement());

    await page.roomList.each( item => {
      item.getAttribute("innerText").then(text => {
        highSchoolRoomNameList.push(text);
      });
    });

我一直收到这个错误:

  

(node:13672)UnhandledPromiseRejectionWarning:未处理的承诺   rejection(rejection id:1):StaleElementReferenceError:陈旧元素   reference:元素未附加到页面文档(Session   info:chrome = 65.0.3325.181)(驱动信息:chromedriver = 2.38.552522   (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform = Windows NT   6.1.7601 SP1 x86_64)(节点:13672)[DEP0018]弃用警告:不推荐使用未处理的拒绝承诺。在未来,承诺   未处理的拒绝将终止Node.js进程   使用非零退出代码。 (节点:13672)   UnhandledPromiseRejectionWarning:未处理的承诺拒绝   (rejection id:2):StaleElementReferenceError:陈旧元素   reference:元素未附加到页面文档(Session   info:chrome = 65.0.3325.181)

调试后

我发现它在以下步骤失败

// Protractor configuration file, see link for more information
// https://github.com/angular/protractor/blob/master/lib/config.ts

const { SpecReporter } = require("jasmine-spec-reporter");

exports.config = {

  SELENIUM_PROMISE_MANAGER: false,
  allScriptsTimeout: 11000,
  suites: {
    navigation_suite: "./nav-wrapper/e2e/nav-wrapper-navigationTests/**/*.ts"
  },
  specs: [
     "Test.ts"
  ],
  capabilities: {
    browserName: "chrome"
  },
  directConnect: true,
  baseUrl: "http://localhost:3000",

  framework: "jasmine",
  jasmineNodeOpts: {
    showColors: true,
    // Set a longer Jasmine default Timeout for debugging purposes
    defaultTimeoutInterval: 999999,
    print: function() {}
  },

  onPrepare() {
    require("ts-node").register({
      project: "./nav-wrapper/e2e/tsconfig.e2e.json"
    });
    jasmine
      .getEnv()
      .addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
  }
};

在我开始向async / await迁移之前,整个测试工作正常。这是我的protractor.conf.js文件:

PIL.Image.BICUBIC

有关如何重写这些方法的任何建议将不胜感激!

3 个答案:

答案 0 :(得分:0)

这不是直接回答重写方法的问题,但只是想帮助您获得比Unhandled promise rejection更好的错误(这不是那么有用)

如果您在该序列的末尾添加.then,则使用.catch()的位置,您可以对错误执行某些操作,例如在控制台中记录它。这是你应该做的事情,但也会帮助你弄清楚导致错误的原因。

这是我的意思的一个例子:

asyncFuncA.then(AsyncFuncB)
      .then(AsyncFuncC)
      .then(AsyncFuncD).catch(e => {
          //Do something with the error here 
            console.error(e) 
            })

以及您的代码示例

await page.roomList.each((item) => {
        item
            .getAttribute('innerText')
            .then((text) => {
                highSchoolRoomNameList.push(text);
            })
            .catch((e) => {
                console.error(e);
            });
    });

答案 1 :(得分:0)

如果您仍有同样的错误。您可能会尝试以下代码段(稍微修改一下): 等待浏览器       。切换到()       .frame(元件(by.tagName( “IFRAME”))getWebElement());

await page.roomList.each(async item => {
  await item.getAttribute("innerText").then(text => {
    highSchoolRoomNameList.push(text);
  });
});

答案 2 :(得分:-2)

在afterEach函数中添加browser.sleep解决了我的问题。您可以尝试一下。

afterEach(async () => {
await browser.sleep(SLEEP_DURATION);
});