use*_*089 5 asynchronous node.js promise angularjs protractor
因此,我正在使用async / await(Link)迁移量角器测试。
到目前为止,迁移工作还是比较成功的,直到我继续遇到这个问题。因此,下面是我测试的步骤,后面是代码,作为我正在处理的示例:
上面步骤的相关代码:
测试
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);
});
});
});
Run Code Online (Sandbox Code Playgroud)
我不断收到此错误:
(节点:13672)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):StaleElementReferenceError:stale element reference:元素未附加到页面文档中(会话信息:chrome = 65.0.3325.181)(驱动程序信息:chromedriver = 2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),平台= Windows NT 6.1.7601 SP1 x86_64)(节点:13672)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。(节点:13672)UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:2):StaleElementReferenceError:stale element reference:元素未附加到页面文档中(会话信息: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);
});
});
Run Code Online (Sandbox Code Playgroud)
在我开始向异步/等待迁移之前,整个测试曾经运行良好。这是我的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 } }));
}
};
Run Code Online (Sandbox Code Playgroud)
关于如何重写这些方法的任何建议将不胜感激!
这不是重写方法问题的直接答案,只是想帮助您获得更好的错误Unhandled promise rejection(这并不是那么有帮助)
如果您在该序列的末尾.then放置一个,则可以对错误执行某些操作,例如将其记录在控制台中。.catch()无论如何,这是您应该做的事情,但也将帮助您找出导致错误的原因。
这是我的意思的一个例子:
asyncFuncA.then(AsyncFuncB)
.then(AsyncFuncC)
.then(AsyncFuncD).catch(e => {
//Do something with the error here
console.error(e)
})
Run Code Online (Sandbox Code Playgroud)
和你的代码示例
await page.roomList.each((item) => {
item
.getAttribute('innerText')
.then((text) => {
highSchoolRoomNameList.push(text);
})
.catch((e) => {
console.error(e);
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1900 次 |
| 最近记录: |