Groovy 将JSESSIONID从SOAP响应传递到SOAP UI中的HTTP请求

Groovy 将JSESSIONID从SOAP响应传递到SOAP UI中的HTTP请求,groovy,soapui,jsessionid,Groovy,Soapui,Jsessionid,我有一个通过SOAP请求执行登录的测试用例,响应包括以下标题: Set-Cookie | JSESSIONID=85fc792a71f8eb1e2f0e9c63339e; Path=/somepath; HttpOnly 之后,我有一个对URL的HTTP请求,只有登录成功后才能访问该URL。 尽管我在TestCase选项中将“维护HTTP会话”设置为true,但JSESSIONID cookie不会传递给我的HTTP请求。HTTP请求在没有JSESSIONID的情况下执行,因此响应不是请

我有一个通过SOAP请求执行登录的测试用例,响应包括以下标题:

Set-Cookie  |   JSESSIONID=85fc792a71f8eb1e2f0e9c63339e; Path=/somepath; HttpOnly
之后,我有一个对URL的HTTP请求,只有登录成功后才能访问该URL。 尽管我在TestCase选项中将“维护HTTP会话”设置为true,但JSESSIONID cookie不会传递给我的HTTP请求。HTTP请求在没有JSESSIONID的情况下执行,因此响应不是请求的URL,而是登录页面。我猜这是因为登录过程是SOAP请求而不是HTTP

我试图用groovy脚本来处理这个问题:我能够从SOAP响应中捕获JSESSIONID并将其设置为

Cookie  |  JSESSIONID=85fc792a71f8eb1e2f0e9c63339e
但响应仍然是登录页面,而不是请求的页面。你知道如何解决这个问题吗?
假设测试用例有两个具有以下名称的测试步骤,SOAP UI版本为5.2.1

  • 步骤1(SOAP请求测试步骤的)
  • 步骤2(HTTP请求测试步骤的)
step1
响应在响应头中包含
Set Cookie
。而
step2
需要将上述
Cookie
作为请求头的一部分发送

下面针对
step1
脚本断言将
Cookie
设置为
step2
。请关注在线评论

脚本断言:

/**
* This script assertion reads the http response, 
* collect the cookies for the next http request
* Provide the next step name where you want to set the Cookie to the request 
**/

//Change the name of the test step2 below as per your test
def nextStepName = 'step2'

//Assert if the step1 response has headers
assert messageExchange.responseHeaders, "Response does not have headers"

//Get the next request using test step name
def nextRequest = context.testCase.testSteps[nextStepName].httpRequest

//Get the existing headers
def headers = nextRequest.requestHeaders

//Get Cookie from step1 response and create headers
if (messageExchange.responseHeaders.containsKey('Set-Cookie')) {
  log.info "Found Cookie in the response headers"
  def cookiez = messageExchange.responseHeaders['Set-Cookie'].value
  def list = []  
  cookiez.each { cookies ->
     list.add(cookies.toString())
  }
  headers['Cookie'] = list
} else {
  log.warn "Not Found Cookie in the response headers"
}

//Set the headers for step2
nextRequest.requestHeaders = headers
更新1

下面是改进的
脚本断言
,它允许您非常轻松地扩展:

  • 从当前步骤响应到任意数量的标头
  • 根据需要执行任意数量的测试步骤
/**
*这是脚本断言
*将标题设置为请求的目标步骤
*通过从当前步骤响应中提取标题
**/
//如果响应有头,则断言
断言messageExchange.responseHeaders,“响应没有任何头”
//将要从当前测试步骤响应中检索的所有头指定为键,将目标步骤请求头指定为值
//key-当前响应头名称
//值-目标请求标头名称
//如果需要提取和设置更多标题,请在地图中添加更多键、值
def headerMap=['Set-Cookie':'Cookie']
//指定要为其设置标头的测试步骤名称。根据需要更改步骤名称。
//根据需要使用不同的测试步骤名称添加对setHttpHeaders的调用,以应用更多步骤
setHttpHeaders('step2',headerMap)
/**
*方法将标题设置为目标步骤
*步骤是要为其设置标题的步骤名称
*标题映射由当前步骤中的键、标题名称和要显示在当前步骤中的值、标题名称组成
*目标步骤
* 
**/
def setHttpHeaders(def step,def headerMap){
def nextRequest=context.testCase.testSteps[step]?.httpRequest
def existingHeaders=nextRequest?.requestHeaders
校长每人一张{
existingHeaders[it.value]=getHttpHeaderValue(it.key)
}
nextRequest?.requestHeaders=现有Headers
}
/**
*方法检索指定标头的值
**/
def getHttpHeaderValue(def headerToLookup){
if(messageExchange.responseHeaders.containsKey(headerToLookup)){
log.info“在响应头中找到${headerToLookup}”
返回消息Exchange.responseHeaders[headerToLookup]
}否则{
log.warn“${headerToLookup}在响应头中找不到”
}
无效的
}

非常感谢您的回答,我明天会检查您的解决方案并给您反馈。我尝试了您的脚本断言解决方案。它成功地将头从步骤1(登录SOAP响应)设置为步骤2(HTTP请求),但HTTP请求似乎忽略了它:响应仍然是登录页面,而不是请求的页面。HTTP响应还有一个Set Cookie头,其中包含一个JSESSIONID,但与请求的Set Cookie头不同。我想应该是一样的。我错了吗?HTTP响应还有一个名为“Expires”的头,其值为日期从1995年开始。Cookie是否可能在使用前已过期?请清理步骤2的标题,特别是,
Cookie
如果有。你试过上面的哪个脚本?您可以通过这种方式快速检查:首先仅运行step1,查看step2标题处的值。可能您可以取消选中
维护HTTP会话
,然后重试。@TamásG.,您可以查看上面的注释并在此处更新。