Protractor函数在Cucumber步骤定义中调用返回Undefined问题排查
问题原因及解决方法
我来帮你分析下这个问题哈,我之前也踩过类似的Promise返回undefined的坑!
问题根源
你的fetchTableContentsToArray函数内部能正常打印数组,但外部调用返回undefined,核心原因有两个:
- 函数未返回最终Promise结果:虽然你在
element.all(...).then()里return了tableArray,但整个fetchTableContentsToArray函数并没有把这条Promise链返回出去。async函数如果没有明确return值,默认会返回一个resolve为undefined的Promise。 - 混用async/await与.then()导致逻辑混乱:你在已标记为async的函数里嵌套了
.then(),还做了不必要的await嵌套(比如await tableArray.push(value),push是同步操作完全不需要await),这很容易让你忽略返回值的传递链路。
另外注意你代码里的##LOCATOR##应该是要替换成参数ORString吧?这个小细节也得修正。
修复后的函数写法
我们用纯async/await重构函数,去掉冗余的then嵌套,明确返回数组:
fetchTableContentsToArray: async function(Page, ORString){ let tableArray = []; // 存储表格数据的空数组 // 获取所有目标元素 const tableElements = await element.all(by.css(ORString)); // 遍历元素并提取文本 for (const elem of tableElements) { const textValue = await elem.getText(); tableArray.push(textValue); } console.log(tableArray); return tableArray; // async函数会自动把这个值包装成resolved状态的Promise },
步骤定义的简化调用
同样用async/await简化调用,不用再嵌套.then():
let driver = require('Path to functions file'); Then(/^I check for new data on "([^"]*)" on "([^"]*)"$/, async function (element, page) { const val = await driver.fetchTableContentsToArray(page, element); console.log(val); // 现在就能正常打印数组了 });
额外注意点
- 尽量避免在async函数里混用
.then(),async/await本身就是为了让异步代码更像同步代码,混用反而增加复杂度。 - 同步操作(比如数组push)不需要加await,只有Promise类型的操作才需要await。
内容的提问来源于stack exchange,提问作者Siddharth Mishra
相关产品推荐
相关产品推荐

