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

Protractor中如何提取getText()返回的实际文本值?

解决Protractor中getText()返回Promise导致断言失败的问题

你的问题根源很明确:Protractor的getText()方法返回的是Promise对象,而非直接的字符串值。所以你直接把thisLast和thisFirst拼接时,其实是在拼接两个未解析的Promise,自然得到[Object Object] [Object Object]的结果。下面给你两种可行的解决方案,其中第二种更简洁易读。

方案1:使用Promise链式调用(传统写法)

我们可以用Promise.all()并行获取两个文本的解析值,再在后续的then()回调中完成点击和断言操作:

element.all(by.name('nameRow')).count().then(function(size){
  const thisNum = Math.floor(Math.random() * size); // 生成0到size-1的随机整数,更可靠
  // 并行获取last和first的文本值
  return Promise.all([
    element.all(by.name('last')).get(thisNum).getText(),
    element.all(by.name('first')).get(thisNum).getText()
  ]).then(function([lastText, firstText]) {
    // 点击选中的行
    element.all(by.name('nameRow')).get(thisNum).click();
    const newElement = element(by.tagName('h3'));
    const expectedString = `${firstText} ${lastText}`;
    // 断言:h3文本包含预期字符串
    return expect(newElement.getText()).toContain(expectedString);
  });
});

方案2:使用async/await(推荐,代码更清晰)

Protractor完全支持ES2017的async/await语法,它能让异步代码看起来像同步代码,极大提升可读性:

async function verifyRandomRowText() {
  // 获取行总数
  const rowCount = await element.all(by.name('nameRow')).count();
  // 生成随机行索引
  const randomIndex = Math.floor(Math.random() * rowCount);
  
  // 获取目标行的元素,避免重复定位
  const targetRow = element.all(by.name('nameRow')).get(randomIndex);
  // 并行获取该行的first和last文本
  const [firstText, lastText] = await Promise.all([
    targetRow.element(by.name('first')).getText(),
    targetRow.element(by.name('last')).getText()
  ]);
  
  // 点击目标行
  await targetRow.click();
  
  // 获取h3的文本并断言
  const headerText = await element(by.tagName('h3')).getText();
  const expectedString = `${firstText} ${lastText}`;
  expect(headerText).toContain(expectedString);
}

// 执行测试函数
verifyRandomRowText();

额外优化点

  • 避免直接调用thisLast.resolve():Promise的解析必须通过then()或await,直接调用resolve()不是正确的用法。
  • 优化元素定位:直接从目标行中查找first和last元素(targetRow.element(by.name('first'))),比重新调用element.all()更高效,也能避免因DOM变化导致的定位错误。
  • 随机数生成:用Math.floor(Math.random() * size)替代parseInt,能更稳定地生成0到size-1的整数,避免出现超出索引范围的情况。

内容的提问来源于stack exchange,提问作者Reverend Bubbles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:43:56