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

如何通过Nightwatch/Selenium WebDriver提取元素文本并存储为数组用于测试对比

解决Nightwatch.js提取元素文本到数组的问题

嘿,我来帮你搞定这个问题!你遇到的driver未定义问题,是因为混淆了原生Selenium WebDriver和Nightwatch.js的用法——Nightwatch已经把WebDriver的核心操作封装在browser对象里了,不需要单独调用外部的driver实例。

下面给你两种可行的解决方案,帮你把目标元素的文本提取成小写数组,方便后续测试对比:

方案1:使用回调式写法(兼容旧版Nightwatch)

这种写法基于Nightwatch的回调机制,逐个获取元素文本并处理:

module.exports = {
  tags: ['someTest'],
  'Test login': function (browser) {
    const headerTexts = [];
    browser
      .elements('css selector', '.react-grid-Header .react-grid-HeaderCell-sortable', (items) => {
        const totalElements = items.value.length;
        let processedCount = 0;

        items.value.forEach(item => {
          // 用browser.elementIdText获取对应元素的文本
          browser.elementIdText(item.ELEMENT, (result) => {
            // 转小写后存入数组
            headerTexts.push(result.value.toLowerCase());
            
            processedCount++;
            // 所有元素处理完成后执行断言
            if (processedCount === totalElements) {
              console.log(headerTexts); // 输出: ['jamie', 'hutber', 'stackoverflow']
              // 对比预期数组
              browser.assert.deepEqual(headerTexts, ['jamie', 'hutber', 'stackoverflow']);
              browser.end();
            }
          });
        });
      });
  }
}

方案2:使用async/await写法(推荐,更简洁易读)

如果你的Nightwatch版本支持async函数(大部分新版本都支持),这种写法会更清晰,避免回调嵌套:

module.exports = {
  tags: ['someTest'],
  'Test login': async function (browser) {
    // 获取所有目标元素
    const items = await browser.elements('css selector', '.react-grid-Header .react-grid-HeaderCell-sortable');
    
    // 批量获取文本并转换为小写数组
    const headerTexts = await Promise.all(
      items.value.map(item => browser.elementIdText(item.ELEMENT))
    ).then(results => results.map(res => res.value.toLowerCase()));
    
    console.log(headerTexts); // 输出预期的小写数组
    // 执行断言对比
    browser.assert.deepEqual(headerTexts, ['jamie', 'hutber', 'stackoverflow']);
    
    browser.end();
  }
}

关键说明:

  • Nightwatch的elements方法返回的每个item里的ELEMENT是元素的唯一标识,我们用browser.elementIdText()就能通过这个标识获取元素文本。
  • 两种写法最终都能得到你想要的['jamie', 'hutber', 'stackoverflow']数组,方便后续的测试断言对比。

内容的提问来源于stack exchange,提问作者Jamie Hutber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:38:03