如何用Nightwatch的.elements()获取元素集合并提取文本?
问题:如何在Nightwatch中获取元素集合的文本内容?
我正在使用Nightwatch测试网站,尝试通过.elements()方法获取元素集合。我的代码如下:
client.elements('css selector', 'p[class="f5 color-fg-muted mb-0 mt-1"]', function(elements) { console.log(elements.value); elements.value.forEach(item => { console.log(item.ELEMENT); }); });
输出结果为:
... { 'element-6066-11e4-a52e-4f735466cecf': 'DE70929C2F5311AC55FD8AFEE548EA6D_element_178' }, { 'element-6066-11e4-a52e-4f735466cecf': 'DE70929C2F5311AC55FD8AFEE548EA6D_element_179' }, { 'element-6066-11e4-a52e-4f735466cecf': 'DE70929C2F5311AC55FD8AFEE548EA6D_element_180' }, ... 80 more items ] undefined undefined undefined undefined ...
这些选择器指向若干p元素,我想要获取这些元素的文本内容。请问如何获取对应的p元素并提取其文本?
解决方法
问题根源
你代码中item.ELEMENT返回undefined,是因为WebDriver标准的元素标识键为element-6066-11e4-a52e-4f735466cecf,而非ELEMENT。另外,.elements()仅返回元素ID集合,要获取文本需针对每个ID调用专门的文本获取方法。
基础实现代码
遍历元素集合,对每个元素ID调用.elementIdText()获取文本:
client.elements('css selector', 'p[class="f5 color-fg-muted mb-0 mt-1"]', function(elements) { elements.value.forEach(item => { // 获取标准元素ID const elementId = item['element-6066-11e4-a52e-4f735466cecf']; client.elementIdText(elementId, function(textResult) { console.log(textResult.value); // 输出元素文本内容 }); }); });
异步简化写法(推荐)
如果你的Nightwatch版本支持,使用async/await让代码更易读:
module.exports = { '获取元素集合文本': async function(client) { // 先等待元素加载完成(可选,针对动态页面) await client.waitForElementPresent('p[class="f5 color-fg-muted mb-0 mt-1"]', 5000); const elements = await client.elements('css selector', 'p[class="f5 color-fg-muted mb-0 mt-1"]'); for (const item of elements.value) { const elementId = item['element-6066-11e4-a52e-4f735466cecf']; const textResult = await client.elementIdText(elementId); console.log(textResult.value); } client.end(); } };
额外提示
- 确认选择器准确性,避免因class顺序或多余空格导致匹配失败;
- 动态页面务必添加等待元素出现的逻辑,防止因元素未加载完成导致的获取失败。
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

