在xpath提取器中使用jmeter变量

Chr*_*ris 7 xpath jmeter

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

Ali*_*lik 1

尝试将Beanshell PostProcessor与 beanshell/java 代码结合使用,以使用 xpath 查询从 xml-response 中提取所有值。

  1. 将 Beanshell PostProcessor 作为子级附加到返回 html 响应的采样器。
  2. 在后处理器中使用以下代码(来自外部文件或插入“脚本”字段)来提取并保存密钥:

    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()"将为您提供所有行中的所有列。
要获得更具体的选择,您可以:

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

希望这可以帮助。