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

Protractor中return语句先于异步代码执行致返回值错误问题

解决Protractor中return语句先于异步代码执行的问题

你碰到的这个问题是Protractor里非常典型的异步执行顺序坑——因为Protractor基于WebDriverJS,所有和页面交互的API(比如getText())都是异步的,返回的是Promise对象,而你的同步return Outcome会在Promise的回调逻辑执行前就先跑了,自然永远返回初始值false。

下面给你两种简洁的解决方案:

方案1:返回Promise并利用链式调用

把函数的返回类型改成Promise<boolean>,在.then()的回调里返回最终结果,这样整个函数会把异步逻辑的结果通过Promise传递出去:

public newcc(newc:string): Promise<boolean> {
  return this.Cc.getText().then(function (text){
    const name = text.toString();
    const strArray = name.split(',');
    console.log("Cce : " + name);
    
    let outcome = false;
    for(let i = 0; i < strArray.length; i++) {
      // 建议加trim()处理空格,避免因为前后空格导致匹配失败
      if(strArray[i].trim() === newc.trim()) {
        console.log(`${strArray[i]} is equal to ${newc}`);
        outcome = true;
        console.log("Inside Outcome " + outcome);
        break;
      } else {
        console.log(`${strArray[i]} is not equal to ${newc}`);
      }
    }
    // 在回调里返回结果,让Promise resolve这个值
    return outcome;
  });
}

调用这个函数时,需要通过.then()获取结果:

// 示例调用
yourPageObject.newcc("目标名称").then(result => {
  console.log("匹配结果:", result);
  // 这里可以基于result做后续逻辑处理
});

方案2:用async/await让异步代码“同步化”

这是更现代、可读性更高的写法,通过async/await语法把异步逻辑写成同步的样子,本质还是Promise的语法糖:

public async newcc(newc:string): Promise<boolean> {
  // await会等待getText()的Promise完成,拿到实际的文本值
  const text = await this.Cc.getText();
  const name = text.toString();
  const strArray = name.split(',');
  console.log("Cce : " + name);
  
  let outcome = false;
  for(let i = 0; i < strArray.length; i++) {
    if(strArray[i].trim() === newc.trim()) {
      console.log(`${strArray[i]} is equal to ${newc}`);
      outcome = true;
      console.log("Inside Outcome " + outcome);
      break;
    } else {
      console.log(`${strArray[i]} is not equal to ${newc}`);
    }
  }
  return outcome;
}

调用时,需要在async函数里用await获取结果:

// 必须在async函数中调用
async someTestFunction() {
  const result = await yourPageObject.newcc("目标名称");
  console.log("匹配结果:", result);
}

额外注意点

  1. 原代码里的变量名有点混乱(比如cc、ClinicName、Cc),建议统一成参数newc,避免变量名错误导致的bug
  2. 字符串匹配时加上trim()很有必要,页面返回的文本经常会带前后空格,直接匹配容易失败
  3. Protractor里所有和页面交互的操作都是异步的,所以涉及这些操作的函数几乎都要返回Promise或者用async/await

内容的提问来源于stack exchange,提问作者DtestA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:50:19