2012-02-08 24 views
7

Quiero iterar sobre un conjunto de filas de una respuesta html (por ejemplo, cada fila contiene datos que deseo usar en otra solicitud). Para ello he creado una variable llamada CONTADOR y tengo que configurar un extractor XPath cuyo campo de consulta XPath aUsar variables de jmeter en el extractor xpath

//table//tr[${COUNTER}]/td[0] 

Sin embargo esto no funciona para obtener un resultado, independientemente del valor del contador. Si reemplazo $ {COUNTER} con un valor numérico, p.

//table//tr[4]/td[0] 

funciona según lo esperado.

El siguiente error indica que esta funcionalidad debe estar en 2.5.1 https://issues.apache.org/bugzilla/show_bug.cgi?id=51885 pero no funciona para mí en los puntos 2.5.1 y 2.6

Uso de variables en expresiones XPath debe ser muy útil en jmeter pero no se puede encontrar ninguna conversación sobre cómo hacer esto en la web. Estoy abierto a sugerencias alternativas, pero Regular Expressions no parece ser la solución correcta de inmediato.

Respuesta

1

Intente usar Beanshell PostProcessor con código beanshell/java para extraer todos los valores de xml-response utilizando la consulta xpath.

  1. Conecte Beanshell PostProcessor como secundario a la muestra que devuelve su respuesta html.
  2. Utilice el siguiente código en el post-procesador (de archivo externo o introduzca en el campo "escritura") para extraer y guardar las claves:

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


Usando xpathExpr = "//table//tr/td/text()" le dará todas las columnas de todas las filas
Para obtener una selección más específica se puede:

  • refinar consulta XPath, por ejemplo, //table//tr/td[1]/text();
  • extrae todos los valores y luego repite la lista de resultados para obtener exactamente lo que necesitas.

Espero que esto ayude.

Cuestiones relacionadas