我想从html响应迭代一组表行(例如,每行包含我想在另一个请求中使用的数据)。为此,我设置了一个名为COUNTER的变量,并设置了一个XPath Extractor,XPath Query字段设置为
//table//tr[${COUNTER}]/td[0]
然而,无论COUNTER的值如何,都无法获得结果。如果我用数值替换$ {COUNTER},例如
//table//tr[4]/td[0]
它按预期工作。
以下错误表明此功能应在2.5.1中 https://issues.apache.org/bugzilla/show_bug.cgi?id=51885但它在2.5.1或2.6中对我不起作用
在XPath表达式中使用变量必须在jmeter中非常有用,但我找不到任何关于如何在Web上执行此操作的说明。我愿意接受其他建议,但正则表达式并不会立即成为正确的解决方案。
答案 0 :(得分:1)
尝试使用带有beanshell / java代码的Beanshell PostProcessor来使用xpath查询从xml-response中提取所有值。
在PostProcessor中使用以下代码(从外部文件或插入“脚本”字段)来提取和保存密钥:
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();
}
使用xpathExpr = "//table//tr/td/text()"
将为您提供所有行中的所有列
要获得更具体的选择,您可以:
//table//tr/td[1]/text()
; 希望这有帮助。
答案 1 :(得分:0)
我正在使用JMeter 3.3,并且能够在XPATH字符串中使用JMeter变量而没有任何问题。例如/a/b/c[name="mystring_${myvar}"]
因此,我建议切换到JMeter 3.3或更高版本以解决上述问题。