Protractor中用async/await排序表格报错:elm.getText()不是函数
解决
elm.getText() is not a function的问题 嘿,我来帮你排查这个问题~ 这个错误的核心其实是你遍历的elementfinder里的每个elm并不是能调用.getText()的WebElement实例,咱们一步步拆解解决:
1. 先搞清楚elementfinder到底是什么
首先得确认elementfinder的类型:
- 如果它是Protractor的ElementArrayFinder:别直接用lodash的
_.map遍历它!ElementArrayFinder是个异步的集合对象,得先通过await把它解析成实际的WebElement数组才行。 - 如果它是原生Selenium的定位器数组(比如一堆
By.css('.row')这种):那得先通过driver.findElement()拿到对应的WebElement,才能调用.getText()。 - 如果它是普通数组但元素不是WebElement:那自然没
.getText()方法,得先确保你拿到的是页面上的真实元素对象。
2. 针对Protractor场景的修正代码
假设你用的是Protractor,正确的写法应该是这样:
// 先把ElementArrayFinder解析成实际的WebElement数组 const elements = await elementfinder; // 遍历每个元素获取文本 let lastActivity = await Promise.all(_.map(elements, (elm) => elm.getText())); // 这里要注意:lodash里没有_.sort()这个标准方法,用_.sortBy()更靠谱 let sortedLastActivity = _.sortBy(lastActivity); // 断言表格已经是排序好的状态 expect(lastActivity).toEqual(sortedLastActivity);
3. 原生Selenium场景的修正
如果你用的是原生Selenium,得先通过驱动把定位器转换成元素:
// 假设driver是你的WebDriver实例 const elements = await Promise.all(_.map(elementfinder, (locator) => driver.findElement(locator))); let lastActivity = await Promise.all(_.map(elements, (elm) => elm.getText())); let sortedLastActivity = _.sortBy(lastActivity); expect(lastActivity).toEqual(sortedLastActivity);
额外小提醒
- 关于排序:如果你的文本是数字类型,原生数组的
.sort()默认是字符串排序,可能会出问题,这时候可以传个比较函数,比如.sort((a, b) => Number(a) - Number(b));用lodash的_.sortBy()就不用操心这个啦。
内容的提问来源于stack exchange,提问作者Ninja
相关产品推荐
相关产品推荐

