如何通过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
相关产品推荐
相关产品推荐

