我想从html响应迭代一组表行(例如,每行包含我想在另一个请求中使用的数据).为此,我设置了一个名为COUNTER的变量,并设置了一个XPath Extractor,并将XPath Query字段设置为
//table//tr[${COUNTER}]/td[0]
Run Code Online (Sandbox Code Playgroud)
然而,无论COUNTER的值如何,都无法获得结果.如果我用数值替换$ {COUNTER},例如
//table//tr[4]/td[0]
Run Code Online (Sandbox Code Playgroud)
它按预期工作.
以下错误表明此功能应该在2.5.1 https://issues.apache.org/bugzilla/show_bug.cgi?id=51885中,但它在2.5.1或2.6中对我不起作用
在XPath表达式中使用变量必须在jmeter中非常有用,但我找不到任何关于如何在Web上执行此操作的说明.我愿意接受其他建议,但正则表达式并不会立即成为正确的解决方案.
尝试将Beanshell PostProcessor与 beanshell/java 代码结合使用,以使用 xpath 查询从 xml-response 中提取所有值。
在后处理器中使用以下代码(来自外部文件或插入“脚本”字段)来提取并保存密钥:
import java.io.*;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import org.apache.jmeter.samplers.SampleResult;
// set here your xpath expression (to extract EVERY key, not any separate one)
String xpathExpr = "//table//tr/td/text()";
try {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
// access result of parent sampler via "ctx" BeanShell variable
SampleResult result = ctx.getPreviousResult();
InputSource is = new InputSource(new StringReader(result.getResponseDataAsString()));
Document doc = builder.parse(is);
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(xpathExpr);
NodeList nodes = (NodeList)expr.evaluate(doc, XPathConstants.NODESET);
// extract all the keys in loop
for (int i = 0; i < nodes.getLength(); i++) {
String key = nodes.item(i).getNodeValue();
System.out.println(key);
}
} catch (Exception ex) {
IsSuccess = false;
log.error(ex.getMessage());
ex.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
使用xpathExpr = "//table//tr/td/text()"
将为您提供所有行中的所有列。
要获得更具体的选择,您可以:
//table//tr/td[1]/text()
;希望这可以帮助。