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); }
额外注意点
- 原代码里的变量名有点混乱(比如
cc、ClinicName、Cc),建议统一成参数newc,避免变量名错误导致的bug - 字符串匹配时加上
trim()很有必要,页面返回的文本经常会带前后空格,直接匹配容易失败 - Protractor里所有和页面交互的操作都是异步的,所以涉及这些操作的函数几乎都要返回Promise或者用
async/await
内容的提问来源于stack exchange,提问作者DtestA
相关产品推荐
相关产品推荐

