2012-02-08 31 views
7

我想遍歷html響應中的一組錶行(例如,每行包含我想在另一個請求中使用的數據)。要做到這一點我已經建立了一個名爲COUNTER變量,我已經安裝一個XPath提取與XPath查詢字段設置到在xpath提取器中使用jmeter變量

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

但是這不能不管計數器的值的獲得結果。如果我用數值替換$ {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代碼來使用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(); 
    } 
    


使用xpathExpr = "//table//tr/td/text()"會給你所有的列所有的行。
要獲得更具體的選擇,您可以:

  • 細化XPath查詢,例如//table//tr/td[1]/text();
  • 提取所有值,然後遍歷結果列表以獲取您確切需要的內容。

希望這會有所幫助。

相關問題