Protractor技术咨询:改写方法返回ElementArrayFinder的getTexts结果数组
解决Protractor中ElementArrayFinder文本提取返回空数组的问题
我明白你遇到的问题了——这是典型的JavaScript异步操作时序问题,你的代码逻辑没问题,但没处理好Protractor中Promise的异步执行顺序。
问题根源
你的代码里,elements.each()和elem.getText()都是异步的Promise操作:当你执行return data时,这些异步操作还没开始执行(或者还没完成),所以返回的是空数组。而你在elem.getText().then()内部能看到正确数据,是因为那时候对应的异步操作已经完成了。
改写后的解决方案
我们可以利用ElementArrayFinder的map()方法,结合Promise.all()来等待所有文本提取操作完成,最终返回包含所有文本的Promise。另外,Protractor其实给ElementArrayFinder提供了直接的getText()方法,能更简洁地实现需求:
方法1:手动处理Promise(清晰展示逻辑)
static getAllTexts(elements: ElementArrayFinder): Promise<string[]> { // 将每个元素的getText操作映射为Promise数组 const textPromises = elements.map((elem) => { return elem.getText(); }); // 等待所有Promise完成,返回结果数组 return Promise.all(textPromises); }
方法2:使用ElementArrayFinder自带的getText()(更简洁)
其实ElementArrayFinder本身就有getText()方法,它会返回一个包含所有元素文本的Promise,完全不用自己遍历:
static getAllTexts(elements: ElementArrayFinder): Promise<string[]> { return elements.getText() as Promise<string[]>; }
如何调用这个方法
因为返回的是Promise,你需要用async/await或者then()链式调用来获取结果:
// 方式1:使用async/await(推荐,代码更易读) async function yourTest() { const targetElements = element.all(by.css('.your-selector')); const allTexts = await YourClassName.getAllTexts(targetElements); console.log(allTexts); // 这里就能拿到完整的文本数组了 } // 方式2:使用then()链式调用 const targetElements = element.all(by.css('.your-selector')); YourClassName.getAllTexts(targetElements).then((allTexts) => { console.log(allTexts); });
这样修改后,就能确保你拿到的是所有元素文本组成的完整数组了。
内容的提问来源于stack exchange,提问作者Sitam Jana
相关产品推荐
相关产品推荐

