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

如何通过Karate从HTML的Head Meta标签中提取指定name的值?

如何从API返回的HTML响应中提取csrf-token元标签的值?

API返回HTML响应,需要从<head>下name为csrf-token的<meta>标签中提取content属性对应的值。返回的HTML内容如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="csrf-token" content="I-need-this-value"/>
</head>

已尝试的方法及问题

正则提取失败

按相关思路编写代码后,无法匹配到目标值:

Background:
#   call auth with shared scope
    * call read('classpath:util/auth.feature')
    * def dashboard = 'https://ourURL.com/dashboard'

Scenario: get csrf-token
    Given url dashboard
    When method get
    * def responseHtml = response
    * def csrfToken = karate.extract(responseHtml, 'csrf-token.text=\\&quot;([^\\&quot;]+)', 1)
    * print csrfToken

执行报错:

14:05:02.696 [main] WARN  com.intuit.karate - failed to find pattern: csrf-token.text=\&quot;([^\&quot;]+)
14:05:02.698 [main] INFO  com.intuit.karate - [print] null

后续尝试将响应转为字符串后再提取,结果一致。

Karate UI提取失败

尝试通过UI定位元素,结果返回null:

Scenario: get csrf-token
    Given driver 'https://ourURL.com/dashboard'
    Then match driver.title == 'Dashboard'
    * def e = text('meta[name=csrf-token')
    * print 'e is ' + e

打印结果:[print] e is null

可行解决方案

方案1:修正正则表达式

问题出在匹配模式错误,调整正则以匹配content属性的结构:

Scenario: get csrf-token
    Given url dashboard
    When method get
    * string responseStr = response
    * def csrfToken = karate.extract(responseStr, 'meta name=\"csrf-token\" content=\"([^\"]+)\"', 1)
    * print csrfToken

该正则直接捕获content属性内的字符串,确保转义引号正确,能精准匹配目标值。

方案2:利用Karate的HTML解析能力(推荐)

Karate会自动将HTML响应解析为类似XML的结构,可直接通过路径提取属性:

Scenario: get csrf-token
    Given url dashboard
    When method get
    # 通过索引定位csrf-token的meta标签
    * def csrfToken = response.head.meta[1].@content
    * print csrfToken

若不确定meta标签的索引,可通过过滤精准匹配:

* def csrfMeta = karate.filter(response.head.meta, function(x){ return x.@name == 'csrf-token' })[0]
* def csrfToken = csrfMeta.@content

方案3:修正Karate UI的定位逻辑

UI方法失败是因为定位器语法错误,且text()不适合获取meta标签属性,改用attribute():

Scenario: get csrf-token
    Given driver 'https://ourURL.com/dashboard'
    Then match driver.title == 'Dashboard'
    * def csrfToken = attribute('meta[name="csrf-token"]', 'content')
    * print csrfToken

使用正确的CSS选择器meta[name="csrf-token"],再通过attribute()方法获取content属性值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:23:22