如何在Karate框架中遍历Webtable、存储行并处理匹配UI行
在Karate框架中遍历WebTable并处理符合条件的行
核心实现逻辑
- 定位并提取表格数据行:排除表头,精准定位表格内的所有数据行元素
- 封装每行数据:遍历每行,提取5列文本内容并封装为映射(Map)列表
- 筛选目标行:匹配指定列的条件,定位到对应的行元素
- 执行后续UI操作:对符合条件的行执行点击等操作
示例代码实现
假设目标表格的HTML结构如下(仅作参考):
<table id="business-table"> <thead> <tr><th>ID</th><th>名称</th><th>状态</th><th>类型</th><th>操作</th></tr> </thead> <tbody> <tr><td>001</td><td>项目A</td><td>待处理</td><td>常规</td><td><button>操作</button></td></tr> <tr><td>002</td><td>项目B</td><td>已完成</td><td>紧急</td><td><button>操作</button></td></tr> </tbody> </table>
1. 获取所有行并提取列数据
// 定位表格所有数据行(跳过表头行) def rows = locateAll('table#business-table tbody tr') // 遍历每行,提取5列内容并存储为Map列表 def rowDataList = karate.map(rows, function(row){ def cols = locateAll(row, 'td') return { id: cols[0].text, name: cols[1].text, status: cols[2].text, type: cols[3].text, operation: cols[4].text } })
2. 筛选目标行并执行点击
// 定义匹配条件:比如筛选"状态"列为"待处理"的行 def targetStatus = '待处理' // 遍历数据列表,找到匹配的行并点击 karate.forEach(rowDataList, function(data, index){ if (data.status == targetStatus) { // 获取对应行元素并执行点击 rows[index].click() // 若仅需处理首个匹配项,可添加终止逻辑 karate.set('stopLoop', false) return } })
关键优化说明
- 定位适配:需根据页面实际的表格ID、class或DOM层级调整定位表达式,确保元素定位准确
- 性能优化:若表格行数较多,可直接通过JS脚本批量提取数据,减少UI交互开销:
def rowDataList = scriptAll(""" Array.from(document.querySelectorAll('table#business-table tbody tr')).map(tr => { const tds = tr.querySelectorAll('td'); return { id: tds[0].innerText, name: tds[1].innerText, status: tds[2].innerText, type: tds[3].innerText, operation: tds[4].innerText }; }) """) - 多匹配处理:若需处理所有符合条件的行,移除循环内的终止逻辑即可
内容的提问来源于stack exchange,提问作者Damayanti Vinayakam
相关产品推荐
相关产品推荐

