Использование переменных jmeter в экстракторе xpath - PullRequest
7 голосов
/ 08 февраля 2012

Я хочу перебрать набор строк таблицы из ответа html (например, каждая строка содержит данные, которые я хочу использовать в другом запросе).Для этого я установил переменную с именем COUNTER и настроил экстрактор XPath с полем запроса XPath, установленным на

//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, но я не могу найти разговоров о том, как это сделать в Интернете.Я открыт для альтернативных предложений, но Регулярные выражения не сразу кажутся правильным решением.

Ответы [ 2 ]

1 голос
/ 11 мая 2012

Попробуйте использовать Beanshell PostProcessor с бобовым / Java-кодом для извлечения всех значений из xml-ответа с использованием запроса xpath.

  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();
    }
    


Использование xpathExpr = "//table//tr/td/text()" даст вам все столбцы во всех строках.
Чтобы получить более конкретный выбор, вы можете:

  • уточнение запроса xpath, например, //table//tr/td[1]/text();
  • извлеките все значения, а затем переберите список результатов, чтобы получить именно то, что вам нужно.

Надеюсь, это поможет.

0 голосов
/ 25 февраля 2019

Я использую JMeter 3.3 и могу без проблем использовать переменные JMeter в строке XPATH.Например, /a/b/c[name="mystring_${myvar}"]

Поэтому я предлагаю переключиться на JMeter 3.3 или более позднюю версию, чтобы решить вышеуказанную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...