浅谈后置处理器之XPath提取器
XPath Extractor是一个非常实用的逻辑处理器,它允许用户从服务器响应中提取数据,这些数据通常是HTML、XML或任何基于XML的语言格式。XPath(XML Path Language)是一种在XML文档中查找信息的语言,通过使用 XPath,我们可以定位到XML文档中的某个特定元素或属性。在性能测试和功能测试场景中,XPath Extractor常用于提取动态值,如会话令牌、ID或其他需要在后续请求中复用的数据。
XPath Extractor简介
XPath Extractor位于JMeter的“后处理器”类别下,其主要用途是从响应数据中提取文本内容,并将其存储为变量以供后续请求使用。这在模拟用户与网站或Web服务交互时特别有用,特别是在需要处理那些每次请求都会变化的参数时。
配置XPath Extractor
要在JMeter测试计划中使用XPath Extractor,遵循以下步骤:
- 添加XPath Extractor:
○ 右键点击你想要从中提取数据的HTTP请求。
○ 选择“添加” > “后置处理器” > “XPath 提取器”。 - 配置设置:
XML Parsing Options:
Use Tidy (tolerant parser):当需要处理的页面是HTML格式时,必须选中该选项;如果是XML或XHTML格式(例如RSS返回),则取消选中
○ Quiet:显示需要的HTML页面
○ 报告异常:显示响应报错
○ 显示警告:显示警告
Use Namespaces:如果启用该选项,后续的XML解析器将使用命名空间来分辨
○ Validate XML:根据页面元素模式进行检查解析
○ Ignore Whitespace:忽略空白内容
○ Fetch external DTDs:如果选中该项,外部将使用DTD规则来获取页面内容
引用名称:变量名称
XPath Query:输入你的XPath表达式。这是关键部分,用于定位并提取数据。
匹配数字(0代表随机):匹配内容多少,-1表示全部,0表示随机
缺少值: 如果XPath查询没有匹配到任何内容,将使用此默认值。
应用实例
首先我们使用SpringBoot框架编写一段测试代码接口
//xml
@GetMapping(value = "/xml",produces = "application/xml")
public String Returnxml() {
return "<list>\n" +
"\t<note>\n" +
"\t\t<to>George</to>\n" +
"\t\t<from>John</from>\n" +
"\t\t<heading>Reminder</heading>\n" +
"\t\t<body>Don't forget the meeting!</body>\n" +
"\t</note>\n" +
"\t<note>\n" +
"\t\t<to>Sam</to>\n" +
"\t\t<from>Roy</from>\n" +
"\t\t<heading>content</heading>\n" +
"\t\t<body>Don't forget the buy toys for me!</body>\n" +
"\t</note>\n" +
"\t\t<note>\n" +
"\t\t<to>Joe</to>\n" +
"\t\t<from>Suzy</from>\n" +
"\t\t<heading>title</heading>\n" +
"\t\t<body></body>\n" +
"\t</note>\n" +
"</list>";
}
//html
@GetMapping(value = "/html",produces = "application/html")
public String Returnhtml() {
return "<!DOCTYPE html>\n" +
"<html lang=\"en\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <title>简单表单提交界面</title>\n" +
"</head>\n" +
"<body>\n" +
" <h1>欢迎来到我们的简易表单</h1>\n" +
" <form action=\"/submit_form\" method=\"post\">\n" +
" <label for=\"name\">姓名:</label>\n" +
" <input type=\"text\" id=\"name\" name=\"name\"><br><br>\n" +
" <label for=\"email\">电子邮件:</label>\n" +
" <input type=\"email\" id=\"email\" name=\"email\"><br><br>\n" +
" <label for=\"message\">消息:</label>\n" +
" <textarea id=\"message\" name=\"message\"></textarea><br><br>\n" +
" <input type=\"submit\" value=\"提交\">\n" +
" </form>\n" +
"</body>\n" +
"</html>";
}
我们编写如下脚本:
线程组:保持默认
HTTP信息头管理器:名称设置为accept,值为application/xml
HTTP请求:协议设置为http,服务器名称或IP设置为127.0.0.1,端口设置为8091,方法设置为GET,路径设置为/xml,内容编码为utf-8
情况1:常用XML数据获取
XPath提取器:勾选Return entire XPath fragment instead of text content?引用名称设置为value,根据样例我们获取xml接口中的body信息,所以XPath query设置为list/note/body,匹配数字设置为-1,缺省值设置为NotFound
运行脚本,查看结果树中调试取样器中响应数据的Response Body内容
情况2:常用html数据获取
HTTP信息头管理器:名称设置为accept,值为application/html
HTTP请求:协议设置为http,服务器名称或IP设置为127.0.0.1,端口设置为8091,方法设置为GET,路径设置为/html,内容编码为utf-8
XPath提取器:勾选User Tidy(tolerant parser),引用名称设置为value,根据样例我们获取html接口中的body下的h1信息,所以XPath query设置为html/body/h1,匹配数字设置为-1,缺省值设置为NotFound
运行脚本,查看结果树中调试取样器中响应数据的Response Body内容
XPath查询技巧
● 学习XPath基础:熟悉XPath的基本语法,包括节点选择、属性访问和路径表达式。
● 使用调试工具:利用浏览器的开发者工具或在线XPath测试工具来验证你的XPath表达式是否正确。
● 注意命名空间:如果响应XML包含命名空间声明,可能需要在XPath前加上相应的namespace-uri。
● 提取多个值:默认情况下,XPath Extractor只提取第一个匹配项。若需提取所有匹配项,可以使用XPath Extractor的兄弟组件“XPath2 Extractor”,它支持更高级的XPath 2.0功能。
应用场景示例
● 会话管理:提取登录请求返回的会话ID,用于后续请求的认证。
● 动态参数传递:从响应中提取动态生成的表单字段值,确保表单提交的有效性。
● 数据驱动测试:从XML/HTML数据源中提取测试数据,实现测试用例的数据驱动。
总结
XPath Extractor是JMeter中一个强大且灵活的组件,它极大地扩展了测试脚本处理复杂响应数据的能力。通过熟练掌握XPath语法和正确配置XPath Extractor,你可以构建更加真实、动态和健壮的性能测试场景。