所以我使用async / await(Link)迁移我的量角器测试。
到目前为止,迁移有些成功,直到我继续遇到这个问题。 以下是我的测试步骤,然后是代码,作为我正在处理的内容的一个例子:
以上步骤的相关代码:
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
有关如何重写这些方法的任何建议将不胜感激!
答案 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);
});