2012-02-08 2 views
7

Я хочу перебрать набор строк таблицы из ответа html (например, каждая строка содержит данные, которые я хочу использовать в другом запросе). Для этого я создал переменную COUNTER, и я имею установку XPath экстрактор с множеством поля XPath запросов кИспользование переменных jmeter в экстракторе 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, но я не может найти никаких разговоров о том, как это сделать в Интернете. Я открыт для альтернативных предложений, но регулярные выражения не сразу кажутся правильным решением.

ответ

1

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

  1. Прикрепите PostProcessor Beanshell как дочерний элемент к сэмплеру, который возвращает ваш 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(); 
    } 
    


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

  • УТОЧНИТЬ XPATH запрос, например, //table//tr/td[1]/text();
  • извлекать все значения, а затем перебирать список результатов, чтобы получить то, что вам нужно.

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

Смежные вопросы