fix(接口测试): 增加XPath2Extractor提取解决xml格式和html格式提取问题
--bug=1013099 --user=赵勇 [ 接口测试]-接口场景-添加xpath提取后-不执行 https://www.tapd.cn/55049933/s/1156906
This commit is contained in:
parent
cbccf98a92
commit
fc0856970d
|
@ -10,6 +10,7 @@ import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.jmeter.extractor.JSR223PostProcessor;
|
import org.apache.jmeter.extractor.JSR223PostProcessor;
|
||||||
import org.apache.jmeter.extractor.RegexExtractor;
|
import org.apache.jmeter.extractor.RegexExtractor;
|
||||||
|
import org.apache.jmeter.extractor.XPath2Extractor;
|
||||||
import org.apache.jmeter.extractor.XPathExtractor;
|
import org.apache.jmeter.extractor.XPathExtractor;
|
||||||
import org.apache.jmeter.extractor.json.jsonpath.JSONPostProcessor;
|
import org.apache.jmeter.extractor.json.jsonpath.JSONPostProcessor;
|
||||||
import org.apache.jmeter.save.SaveService;
|
import org.apache.jmeter.save.SaveService;
|
||||||
|
@ -25,6 +26,7 @@ import java.util.StringJoiner;
|
||||||
@JSONType(typeName = "Extract")
|
@JSONType(typeName = "Extract")
|
||||||
public class MsExtract extends MsTestElement {
|
public class MsExtract extends MsTestElement {
|
||||||
private String clazzName = MsExtract.class.getCanonicalName();
|
private String clazzName = MsExtract.class.getCanonicalName();
|
||||||
|
private String xpathType;
|
||||||
|
|
||||||
private List<MsExtractRegex> regex;
|
private List<MsExtractRegex> regex;
|
||||||
private List<MsExtractJSONPath> json;
|
private List<MsExtractJSONPath> json;
|
||||||
|
@ -50,9 +52,15 @@ public class MsExtract extends MsTestElement {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (CollectionUtils.isNotEmpty(this.getXpath())) {
|
if (CollectionUtils.isNotEmpty(this.getXpath())) {
|
||||||
this.getXpath().stream().filter(MsExtractCommon::isValid).forEach(extractXPath ->
|
if (StringUtils.isEmpty(this.xpathType) || StringUtils.equalsAnyIgnoreCase(this.xpathType, "html")) {
|
||||||
samplerHashTree.add(xPathExtractor(extractXPath, extract))
|
this.getXpath().stream().filter(MsExtractCommon::isValid).forEach(extractXPath ->
|
||||||
);
|
samplerHashTree.add(xpathExtractor(extractXPath, extract))
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
this.getXpath().stream().filter(MsExtractCommon::isValid).forEach(extractXPath ->
|
||||||
|
samplerHashTree.add(xpath2Extractor(extractXPath, extract))
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (CollectionUtils.isNotEmpty(this.getJson())) {
|
if (CollectionUtils.isNotEmpty(this.getJson())) {
|
||||||
this.getJson().stream().filter(MsExtractCommon::isValid).forEach(extractJSONPath ->
|
this.getJson().stream().filter(MsExtractCommon::isValid).forEach(extractJSONPath ->
|
||||||
|
@ -94,7 +102,14 @@ public class MsExtract extends MsTestElement {
|
||||||
return extractor;
|
return extractor;
|
||||||
}
|
}
|
||||||
|
|
||||||
private XPathExtractor xPathExtractor(MsExtractXPath extractXPath, StringJoiner extract) {
|
/**
|
||||||
|
* 处理html
|
||||||
|
*
|
||||||
|
* @param extractXPath
|
||||||
|
* @param extract
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private XPathExtractor xpathExtractor(MsExtractXPath extractXPath, StringJoiner extract) {
|
||||||
XPathExtractor extractor = new XPathExtractor();
|
XPathExtractor extractor = new XPathExtractor();
|
||||||
extractor.setEnabled(this.isEnable());
|
extractor.setEnabled(this.isEnable());
|
||||||
extractor.setTolerant(true);
|
extractor.setTolerant(true);
|
||||||
|
@ -113,6 +128,31 @@ public class MsExtract extends MsTestElement {
|
||||||
return extractor;
|
return extractor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理xml
|
||||||
|
*
|
||||||
|
* @param extractXPath
|
||||||
|
* @param extract
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private XPath2Extractor xpath2Extractor(MsExtractXPath extractXPath, StringJoiner extract) {
|
||||||
|
XPath2Extractor extractor = new XPath2Extractor();
|
||||||
|
extractor.setEnabled(this.isEnable());
|
||||||
|
extractor.setName(StringUtils.isNotEmpty(extractXPath.getVariable()) ? extractXPath.getVariable() : this.getName());
|
||||||
|
if (StringUtils.isEmpty(extractor.getName())) {
|
||||||
|
extractor.setName("XPath2Extractor");
|
||||||
|
}
|
||||||
|
extractor.setProperty(TestElement.TEST_CLASS, XPathExtractor.class.getName());
|
||||||
|
extractor.setProperty(TestElement.GUI_CLASS, SaveService.aliasToClass("XPath2ExtractorGui"));
|
||||||
|
extractor.setRefName(extractXPath.getVariable());
|
||||||
|
extractor.setXPathQuery(extractXPath.getExpression());
|
||||||
|
if (extractXPath.isMultipleMatching()) {
|
||||||
|
extractor.setMatchNumber(-1);
|
||||||
|
}
|
||||||
|
extract.add(extractor.getRefName());
|
||||||
|
return extractor;
|
||||||
|
}
|
||||||
|
|
||||||
private JSONPostProcessor jsonPostProcessor(MsExtractJSONPath extractJSONPath, StringJoiner extract) {
|
private JSONPostProcessor jsonPostProcessor(MsExtractJSONPath extractJSONPath, StringJoiner extract) {
|
||||||
JSONPostProcessor extractor = new JSONPostProcessor();
|
JSONPostProcessor extractor = new JSONPostProcessor();
|
||||||
extractor.setEnabled(this.isEnable());
|
extractor.setEnabled(this.isEnable());
|
||||||
|
|
|
@ -98,6 +98,11 @@ export default {
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
created(){
|
||||||
|
if(!this.extract.xpathType){
|
||||||
|
this.extract.xpathType = 'html';
|
||||||
|
}
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
options: EXTRACT_TYPE,
|
options: EXTRACT_TYPE,
|
||||||
|
|
|
@ -23,6 +23,14 @@
|
||||||
<div class="extract-item-editing xpath" v-if="extract.xpath.length > 0">
|
<div class="extract-item-editing xpath" v-if="extract.xpath.length > 0">
|
||||||
<div>
|
<div>
|
||||||
XPath
|
XPath
|
||||||
|
<el-select v-model="extract.xpathType" size="mini" v-loading="loading" @change="reload">
|
||||||
|
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
|
||||||
|
</el-select>
|
||||||
|
<el-tooltip placement="top">
|
||||||
|
<div slot="content">{{ $t('api_test.request.assertions.xpath_info') }}</div>
|
||||||
|
<i class="el-icon-question" style="cursor: pointer"/>
|
||||||
|
</el-tooltip>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="regex-item" v-for="(xpath, index) in extract.xpath" :key="index">
|
<div class="regex-item" v-for="(xpath, index) in extract.xpath" :key="index">
|
||||||
<ms-api-extract-common :if-from-variable-advance="ifFromVariableAdvance" :is-read-only="isReadOnly" :extract-type="type.XPATH" :list="extract.xpath" :common="xpath"
|
<ms-api-extract-common :if-from-variable-advance="ifFromVariableAdvance" :is-read-only="isReadOnly" :extract-type="type.XPATH" :list="extract.xpath" :common="xpath"
|
||||||
|
@ -74,7 +82,8 @@
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
type: EXTRACT_TYPE,
|
type: EXTRACT_TYPE,
|
||||||
loading: false
|
loading: false,
|
||||||
|
options:[{value:'html',label:'html'},{value:'xml',label:'xml'}]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -966,6 +966,7 @@ export class Extract extends BaseConfig {
|
||||||
super();
|
super();
|
||||||
this.resourceId = uuid();
|
this.resourceId = uuid();
|
||||||
this.type = "Extract";
|
this.type = "Extract";
|
||||||
|
this.xpathType = 'html';
|
||||||
this.regex = [];
|
this.regex = [];
|
||||||
this.json = [];
|
this.json = [];
|
||||||
this.xpath = [];
|
this.xpath = [];
|
||||||
|
@ -996,7 +997,6 @@ export class ExtractCommon extends ExtractType {
|
||||||
this.expression = undefined;
|
this.expression = undefined;
|
||||||
this.description = undefined;
|
this.description = undefined;
|
||||||
this.multipleMatching = undefined;
|
this.multipleMatching = undefined;
|
||||||
|
|
||||||
this.set(options);
|
this.set(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1616,6 +1616,7 @@ export default {
|
||||||
debug_first: "First, debug to get the response",
|
debug_first: "First, debug to get the response",
|
||||||
suggest_tip: "Click the note to add the JSONPath assertion",
|
suggest_tip: "Click the note to add the JSONPath assertion",
|
||||||
regex_info: 'Special characters "$ () * +. [] \\ ^ {} |" need to be escaped as "\\ "+"special characters", such as "\\$"',
|
regex_info: 'Special characters "$ () * +. [] \\ ^ {} |" need to be escaped as "\\ "+"special characters", such as "\\$"',
|
||||||
|
xpath_info: 'Select the extraction method according to the content format of the request response',
|
||||||
regular_match: 'Regular match',
|
regular_match: 'Regular match',
|
||||||
none: 'Do not verify []',
|
none: 'Do not verify []',
|
||||||
value_eq: 'Value-equal to [value=]',
|
value_eq: 'Value-equal to [value=]',
|
||||||
|
|
|
@ -1621,6 +1621,7 @@ export default {
|
||||||
set_failure_msg: "设置失败消息",
|
set_failure_msg: "设置失败消息",
|
||||||
suggest_tip: "点击便签添加JSONPath断言",
|
suggest_tip: "点击便签添加JSONPath断言",
|
||||||
regex_info: '特殊字符"$ ( ) * + . [ ] \\ ^ { } |"需转义为"\\ "+"特殊字符",如"\\$"',
|
regex_info: '特殊字符"$ ( ) * + . [ ] \\ ^ { } |"需转义为"\\ "+"特殊字符",如"\\$"',
|
||||||
|
xpath_info: '根据请求响应内容格式,选择提取方式',
|
||||||
regular_match: '正则匹配',
|
regular_match: '正则匹配',
|
||||||
none: '不校验[]',
|
none: '不校验[]',
|
||||||
value_eq: '值-等于[value=]',
|
value_eq: '值-等于[value=]',
|
||||||
|
|
|
@ -1621,6 +1621,7 @@ export default {
|
||||||
set_failure_msg: "設置失敗消息",
|
set_failure_msg: "設置失敗消息",
|
||||||
suggest_tip: "點擊便簽添加JSONPath斷言",
|
suggest_tip: "點擊便簽添加JSONPath斷言",
|
||||||
regex_info: '特殊字符"$ ( ) * + . [ ] \\ ^ { } |"需轉義為"\\ "+"特殊字符",如"\\$"',
|
regex_info: '特殊字符"$ ( ) * + . [ ] \\ ^ { } |"需轉義為"\\ "+"特殊字符",如"\\$"',
|
||||||
|
xpath_info: '根據請求響應內容格式,選擇提取方式',
|
||||||
regular_match: '正則匹配',
|
regular_match: '正則匹配',
|
||||||
none: '不校驗[]',
|
none: '不校驗[]',
|
||||||
value_eq: '值-等於[value=]',
|
value_eq: '值-等於[value=]',
|
||||||
|
|
Loading…
Reference in New Issue