在xpath提取器中使用jmeter变量

时间:2012-02-08 11:59:38

标签: xpath jmeter

我想从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上执行此操作的说明。我愿意接受其他建议,但正则表达式并不会立即成为正确的解决方案。

2 个答案:

答案 0 :(得分:1)

尝试使用带有beanshell / java代码的Beanshell PostProcessor来使用xpath查询从xml-response中提取所有值。

  1. 将Beanshell PostProcessor作为子项附加到返回html响应的采样器。
  2. 在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();
    }
    

  3. 使用xpathExpr = "//table//tr/td/text()"将为您提供所有行中的所有列 要获得更具体的选择,您可以:

    • 细化xpath查询,例如//table//tr/td[1]/text();
    • 提取所有值,然后遍历结果列表以获得您真正需要的内容。

    希望这有帮助。

答案 1 :(得分:0)

我正在使用JMeter 3.3,并且能够在XPATH字符串中使用JMeter变量而没有任何问题。例如/a/b/c[name="mystring_${myvar}"]

因此,我建议切换到JMeter 3.3或更高版本以解决上述问题。