【发布时间】:2018-10-11 17:42:08
【问题描述】:
所以我正在使用 async/await(Link) 迁移我的量角器测试。
到目前为止,在我不断遇到此问题之前,迁移有些成功。 因此,以下是我的测试步骤,然后是代码作为我正在处理的示例:
- 导航到特定页面
- 更改上下文(从学校转到高中)
- 获取高中房间列表
- 再次更改上下文(将学校更改为中学)
- 获取中学房间列表
- 比较两个列表
上述步骤的相关代码:
Test.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);
});
});
});
我不断收到此错误:
(node:13672) UnhandledPromiseRejectionWarning: 未处理的承诺 拒绝(拒绝 id:1):StaleElementReferenceError:陈旧元素 参考:元素未附加到页面文档(会话 信息:chrome=65.0.3325.181)(驱动程序信息:chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),平台=Windows NT 6.1.7601 SP1 x86_64) (node:13672) [DEP0018] DeprecationWarning: 不推荐使用未处理的承诺拒绝。未来,承诺 未处理的拒绝将终止 Node.js 进程 具有非零退出代码。 (节点:13672) UnhandledPromiseRejectionWarning:未处理的承诺拒绝 (rejection id: 2): StaleElementReferenceError: stale element 参考:元素未附加到页面文档(会话 信息:铬=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);
});
});
在我开始迁移到 async/await 之前,整个测试运行良好。这是我的 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 } }));
}
};
任何关于如何重写这些方法的建议将不胜感激!
【问题讨论】:
-
尝试在
await page.dropDownList.get(0).click();之后添加一些睡眠await browser.sleep(10*1000)以进行调试,以等待页面更改完全加载 -
我已经调试了很多次,我基本上也是把列表输出到控制台,看看它是否抓住了一些东西,但仍然没有运气。如果我不走异步/等待迁移路线,它工作正常
标签: angularjs node.js asynchronous promise protractor