You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Protractor函数在Cucumber步骤定义中调用返回Undefined问题排查

问题原因及解决方法

我来帮你分析下这个问题哈,我之前也踩过类似的Promise返回undefined的坑!

问题根源

你的fetchTableContentsToArray函数内部能正常打印数组,但外部调用返回undefined,核心原因有两个:

  1. 函数未返回最终Promise结果:虽然你在element.all(...).then()里return了tableArray,但整个fetchTableContentsToArray函数并没有把这条Promise链返回出去。async函数如果没有明确return值,默认会返回一个resolve为undefined的Promise。
  2. 混用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:10:37