如何从原始值组成的列表中提取指定值(Karate UI+JS测试场景)
问题描述
作为JS初学者,我近期使用Karate UI(Selenium WebDriver的姊妹框架)搭配JS编写网站自动化测试脚本,遇到HTML表格数据提取问题:
需要遍历所有包含目标文本的表格行,提取对应行的指定列值。
目标表格HTML结构
<table class="table"> <tbody> <tr xpath="1"> <td> <a href="link">Write</a> </td> <td>123</td> <td>1.0.1.8</td> <td>TargetProduct1</td> <td></td> <td>P1</td> <td>10.0</td> <td>en-US</td> <td></td> </tr> <tr>...</tr> <tr>...</tr> <tr>...</tr> <tr>...</tr> <tr>...</tr> </tbody> </table>
现有代码与运行输出
使用Karate原生命令筛选匹配行时,命令返回原始值组成的列表,代码及日志如下:
* def getProduct = scriptAll('//table//tbody//tr', '_.innerText', function(x){ return x.contains('TargetProduct') }) * karate.log(getProduct) // 日志输出: Write 123 1.0.1.8 TargetProduct1 P1 10.0 en-US Write 4586 1.0.1.3 TargetProduct5 Test2 10.1 en-US Write 134 1.0.1.1 TargetProduct0 Four2 10.3 en-US Write 3 1.0.1.2 TargetProduct2 Boo3 10.1 en-US
具体需求
提取返回结果中每行第6列的值,组成目标数组['P1', 'Test2', 'Four2', 'Boo3']。此前使用Object.keys提取值的方法不适用于当前列表结构,测试Object.keys、Object.values均无法实现需求。
补充说明:已在Karate官方论坛提交该问题,未获得有效答复。
解决方案
当前写法的核心问题是直接提取了整行的innerText,拿到的是不规则多空格拼接的整行字符串,后续拆分很容易受空白字符数量、空列影响出错,优先在DOM遍历阶段直接定位目标列取值,两种可用方案如下:
方案1:DOM节点直接定位取值(推荐)
无需先提取整行文本再拆分,直接在匹配到符合条件的<tr>后,定位到第6个<td>节点提取文本即可。注意XPath索引从1开始计数,第6列对应td[6]:
* def targetList = scriptAll('//table//tbody//tr[contains(., "TargetProduct")]/td[6]', '_.innerText.trim()') * karate.log(targetList) // 直接输出 ["P1", "Test2", "Four2", "Boo3"]
- 优势:跳过字符串拆分步骤,直接从DOM节点取目标值,不受列内空白、空列、列值含空格等情况影响,稳定性最高。
方案2:现有返回结果字符串拆分
如果必须基于已拿到的getProduct结果处理,可以对每个整行字符串按空白正则分割,过滤空值后取对应索引位(JS数组索引从0开始,第6列对应索引5):
* def extractCol = function(rowStr) { const cells = rowStr.split(/\s+/).filter(item => item.trim() !== '') return cells[5] } * def targetList = getProduct.map(extractCol)
- 注意:该方案依赖每行文本拆分结果和列顺序完全对应,如果某列存在带空格的文本、空列位置变动,会出现取值错位问题,非必要不使用。
内容的提问来源于stack exchange,提问作者hungryhippos
相关产品推荐
相关产品推荐

