当前位置: 首页 > 知识库问答 >
问题:

量角器异步/等待未处理PromiserEjectionWarning:未处理的promise拒绝

花永昌
2023-03-14

所以我迁移我的量角器测试使用异步/等待(链接)。

到目前为止,迁移是比较成功的,直到我一直遇到这个问题。下面是我的测试步骤,然后是代码,作为我正在处理的示例:

  • 导航到特定页面

上述步骤的相关代码:

测验ts

describe("Update room list based on changing context values", () => {
  let page: HelperClass;
  let highSchoolRoomNameList: string[] = [];
  let middleSchoolRoomNameList: string[] = [];

  beforeAll(async () => {
    page = new HelperClass();
    await page.setBrowserSize();
    await page.commonContextTestSteps();
  });

  it("Changing school dropdown value", async () => {
    await page.waitForElement(page.schoolDropDown, 5000);
    await page.schoolDropDown.click();

    await page.waitForElement(page.dropDownList, 5000);
    await page.dropDownList.get(0).click();

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

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

    await page.waitForElement(page.schoolDropDown, 5000);
    await page.schoolDropDown.click();

    await page.waitForElement(page.dropDownList, 5000);
    await page.dropDownList.get(1).click();

    await browser.switchTo().defaultContent();

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

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

    await protractor.promise.controlFlow().execute(() => {
      expect(highSchoolRoomNameList).not.toEqual(middleSchoolRoomNameList);
    });
  });
});

我一直得到这个错误:

(节点: 13672)UnhandledPromiseRejse警告:未处理的promise拒绝(拒绝id: 1): StaleElementRequiceError: stale元素引用:元素未附加到页面文档(会话信息: chrome=65.0.3325.181)(驱动程序信息: chromeDrive=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),平台=Windows NT 6.1.7601 SP1x86_64)(节点: 13672)[DEP0018]disrecationWarning:未处理的promise拒绝被弃用。将来,未处理的promise拒绝将终止Node.js进程,退出代码为非零。(文档(会话信息:chrome=65.0.3325.181)

调试后,我发现它在以下步骤失败

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

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

在我开始迁移到异步/等待之前,整个测试工作正常。这是我的protractor.conf.js文件:

// 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 } }));
  }
};

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

共有2个答案

蒲德曜
2023-03-14

如果你仍然有同样的错误。您可能会尝试以下代码段(从您的代码段稍微修改):wait browser。切换到()。框架(元素(按.tagName(“iframe”))。getWebElement());

await page.roomList.each(async item => {
  await item.getAttribute("innerText").then(text => {
    highSchoolRoomNameList.push(text);
  });
});
朱丰
2023-03-14

这并不是对重写方法问题的直接回答,但只是想帮助您获得比未处理promise拒绝更好的错误(这并不是很有帮助)

使用的位置。然后如果您放入一个。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);
            });
    });

 类似资料:
  • 当我运行部署我的应用程序的命令时,我发现以下错误 (节点: 6292)UnhandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHan

  • 我想使用异步并等待处理承诺。我想在下面的示例中使用这个方法: 在执行时,它给了我一个错误 错误: UnhandledPromiseRejectionWarning:未处理得承诺拒绝.这个错误可能是由于抛出一个没有catch块的异步函数内部,或者是由于拒绝了一个未用.catch()处理的承诺。(拒绝ID:3)

  • 我想在Repl上为我的游戏实现一个基本的排行榜。它,所以我创建了一个节点。js后端。这是我在后端的配置: 但是每当我尝试发布时,我都会得到以下错误: (节点:344)未处理的PromisejectionWarning:TypeError:无法读取null的属性“push” (节点:344)UnhandledPromiseRejtionWarning:未处理的promise拒绝。这个错误要么是由于抛

  • 为了学习角度2,我正在尝试他们的教程。 我得到这样的错误: 我在SO中浏览了不同的问题和答案,但没有发现什么是“未处理的promise拒绝”。 有人能简单地解释一下它是什么,以及<code>错误:生成cmd ENOENT</code>是什么,当它出现时,我需要检查什么才能消除这个警告吗?

  • 我一直得到“UnhandledPromiseRejectionWarning:UnhandledPromiseRejection.此错误源于在没有catch块的异步函数内部抛出,或拒绝未用.catch()处理的Promission.(拒绝ID:2)” 我已经处理了所有的承诺,但错误仍然存在

  • 错误: (节点:6772)UnhandledPromiseRejectionWarning:未处理得承诺拒绝.这个错误可能是由于抛出一个没有catch块的异步函数内部,或者是由于拒绝了一个未用.catch()处理的承诺。要在未处理的承诺拒绝时终止节点进程,请使用CLI标志(请参见https://nodejs.org/api/CLI.html#CLI_unhandled_rejections_mod