You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Karate中使用scriptAll操作指定属性的<div>并提取文本

Karate 页面元素定位与文本提取问题解答

问题描述

我正在编写测试用例以验证页面内容,页面中存在如下迭代结构的元素:

<form>
<div id="line1_R1" style="display:none;">text line 1 </div>
<div class="labelText nonLabelText pos y15 x1" style="white-space: nowrap; width:20.00ex;">text&nbsp;line&nbsp;1&nbsp</div>

<div id="line1_R2" style="display:none;">text line 1 </div>
<div class="labelText nonLabelText pos y16 x1" style="white-space: nowrap; width:20.00ex;">text&nbsp;line&nbsp;1&nbsp</div>
...
</form>

想咨询:

  1. 如何在Karate中使用scriptAll查找所有带有id或style属性的<div>?
  2. 是否可以提取所有id以line1_R+索引开头的<div>的文本并合并?
  3. 是否可以用style属性作为定位器?

解决方案

一、用scriptAll查找带id或style属性的<div>

Karate的scriptAll支持执行JavaScript定位元素,可通过CSS选择器或XPath实现:

方式1:CSS选择器

// 筛选form下带id或style属性的div,提取文本并去除首尾空格
* def divsWithIdOrStyle = scriptAll('form div[id], form div[style]', '_.textContent.trim()')
  • 语法说明:div[id]匹配带id属性的div,div[style]匹配带style属性的div,逗号表示逻辑或。

方式2:XPath

// 用XPath选中form下带id或style属性的div
* def divsWithIdOrStyle = scriptAll("//form/div[@id or @style]", '_.textContent.trim()')

二、提取id以line1_R开头的div文本并合并

可以通过前缀匹配选择器定位目标元素,再合并文本:

CSS选择器实现

// 提取所有id以line1_R开头的div文本
* def targetTexts = scriptAll('form div[id^="line1_R"]', '_.textContent.trim()')
// 合并文本(用空格分隔,可自定义分隔符)
* def mergedText = targetTexts.join(' ')
  • 语法说明:[id^="line1_R"]是CSS前缀匹配选择器,会匹配id以line1_R开头的所有元素。

XPath实现

* def targetTexts = scriptAll("//form/div[starts-with(@id, 'line1_R')]", '_.textContent.trim()')
* def mergedText = targetTexts.join(' ')

三、用style属性作为定位器

完全支持,可通过精确匹配或部分匹配定位:

精确匹配(CSS选择器)

// 定位style属性值完全为"display:none;"的div
* def hiddenDiv = script('form div[style="display:none;"]', '_.textContent.trim()')

部分匹配(适配style值的空格/顺序差异)

// 匹配style中包含"display:none"的所有div
* def hiddenDivs = scriptAll('form div[style*="display:none"]', '_.textContent.trim()')

XPath方式

// 精确匹配style属性
* def hiddenDiv = script('//form/div[@style="display:none;"]', '_.textContent.trim()')
// 部分匹配style内容
* def hiddenDivs = scriptAll('//form/div[contains(@style, "display:none")]', '_.textContent.trim()')
  • 注意:style属性的空格、属性顺序可能影响精确匹配,建议优先使用部分匹配。

内容的提问来源于stack exchange,提问作者Jackson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:10:38