Karate框架scriptAll()筛选表格行后提取指定列值方法咨询
问题场景
- 操作对象为class属性包含
table的HTML表格,表格tbody节点下包含若干tr行节点,每行由多个td列节点组成 - 目标:筛选出文本包含
TargetProduct的行,提取每行第5列的内容(示例对应值为P1、Test2、Four2、Boo3) - 当前使用的Karate脚本如下:
* def getProduct = scriptAll('//table//tbody//tr', '_.innerText', function(x){ return x.contains('TargetProduct') })
- 脚本执行后返回匹配行的整行innerText字符串数组,每个元素为对应行所有列文本以不定数量空白拼接的字符串,示例输出:
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
- 上述返回为无键值字符串数组,尝试
mapWithKey等JSON转换方法均未成功提取目标列值。
实现方案
方案1:直接定位目标DOM节点(推荐,无拆分误差)
无需先提取整行文本再做字符串处理,直接通过XPath定位符合筛选条件的行下的第5列td节点,直接提取文本即可,稳定性最高:
// 匹配class为table的表格下,包含TargetProduct文本的tr行的第5个td,提取去空格后的文本 * def productList = scriptAll('//table[contains(@class,"table")]/tbody/tr[contains(.,"TargetProduct")]/td[5]', '_.innerText.trim()') * print productList // 输出结果: ["P1", "Test2", "Four2", "Boo3"]
方案2:基于现有返回结果做字符串拆分
如果需要基于当前已拿到的整行innerText结果处理,可通过正则按任意长度空白切分字符串,取对应索引位的值即可(注意JS数组索引从0开始,第5列对应索引4):
* def getProduct = scriptAll('//table//tbody//tr', '_.innerText', function(x){ return x.contains('TargetProduct') }) * def productList = getProduct.map(function(row){ return row.trim().split(/\s+/)[4] }) * print productList // 输出结果: ["P1", "Test2", "Four2", "Boo3"]
注意:方案2依赖字符串切分规则,如果某一列的内容本身包含空格,会出现索引错位问题,生产场景优先使用方案1。
内容的提问来源于stack exchange,提问作者hungryhippos
相关产品推荐
相关产品推荐

