如何通过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=\\"([^\\"]+)', 1) * print csrfToken
执行报错:
14:05:02.696 [main] WARN com.intuit.karate - failed to find pattern: csrf-token.text=\"([^\"]+) 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
相关产品推荐
相关产品推荐

