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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:29:28