JavaScript函数内无法更新变量?rows.each()更新rowNumber无效求助
解决Protractor中rows.each()后变量未更新的问题
这是典型的Protractor异步执行特性导致的坑,我来帮你拆解原因和解决办法!
问题根源
Protractor里的element.all()、each()、getText()这些操作全都是异步的,它们返回的是Promise对象,不会阻塞后续同步代码的执行。你之前的写法里,console.log是同步代码,会在rows.each()内部的所有getText().then()回调执行之前就运行,所以此时rowNumber还保持着初始的null值——哪怕你在外层定义变量,也改变不了异步代码的执行顺序。
解决方案
方案1:使用async/await(推荐,代码更易读)
把测试函数改成async函数,用await等待所有异步操作完成,让代码按预期的顺序执行:
var licenceNumber = 233521673; it('should open created Driver Licence', async function() { var rowNumber = null; var rows = element.all(by.repeater('(rowRenderIndex, row) in rowContainer.renderedRows track by $index')); // 用await等待整个each循环执行完毕 await rows.each(async function(element, index) { const rowText = await element.getText(); // 假设你要匹配licenceNumber来定位行号 if (rowText.includes(licenceNumber.toString())) { rowNumber = index; console.log('匹配到目标行,行号:', rowNumber); // 这里能正确输出 } }); // 此时each循环已完成,rowNumber已被赋值 console.log('最终获取的rowNumber:', rowNumber); });
方案2:使用Promise链式调用(兼容旧环境)
如果你的环境不支持async/await,可以利用Protractor的Promise机制,把后续代码放在each()返回的Promise的then()回调里,确保异步操作完成后再执行:
var licenceNumber = 233521673; it('should open created Driver Licence', function() { var rowNumber = null; var rows = element.all(by.repeater('(rowRenderIndex, row) in rowContainer.renderedRows track by $index')); // each()会返回一个Promise,当所有内部操作完成后触发then() rows.each(function(element, index) { // 要返回getText的Promise,确保each等待这个操作完成 return element.getText().then(function(rowText) { if (rowText.includes(licenceNumber.toString())) { rowNumber = index; } }); }).then(function() { // 这里所有行的检查都已完成,rowNumber有值了 console.log('最终获取的rowNumber:', rowNumber); }); });
额外提示
注意在each()内部的回调里,如果有异步操作(比如getText()),一定要返回它的Promise,这样each()才会等待这个操作完成后再处理下一个元素,避免出现漏处理的情况。
内容的提问来源于stack exchange,提问作者LazioTibijczyk
相关产品推荐
相关产品推荐

