2012-02-08 12 views
7

Tôi muốn lặp qua một tập hợp các hàng trong bảng từ một phản hồi html (ví dụ: mỗi hàng chứa dữ liệu mà tôi muốn sử dụng trong một yêu cầu khác). Để thực hiện điều này, tôi đã thiết lập một biến gọi là COUNTER và tôi đã thiết lập một Extractor XPath với lĩnh vực thiết lập XPath Query đểSử dụng biến jmeter trong xpath extractor

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

Tuy nhiên điều này không có được một kết quả không phụ thuộc vào giá trị của COUNTER. Nếu tôi thay thế $ {COUNTER} bằng một giá trị số, ví dụ:

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

hoạt động như mong đợi.

Các lỗi sau đây chỉ ra rằng chức năng này phải ở trong 2.5.1 https://issues.apache.org/bugzilla/show_bug.cgi?id=51885 nhưng nó không làm việc cho tôi trong 2.5.1 tương đương 2,6

Sử dụng các biến trong các biểu thức XPath phải rất hữu ích trong việc jmeter nhưng tôi không thể tìm thấy bất kỳ cuộc trò chuyện nào về cách thực hiện điều này trên web. Tôi mở cho các đề xuất thay thế nhưng Biểu thức chính quy không ngay lập tức có vẻ là giải pháp phù hợp.

Trả lời

1

Cố gắng sử dụng Beanshell PostProcessor với mã beanshell/java để trích xuất tất cả các giá trị từ xml-response bằng truy vấn xpath.

  1. Đính kèm Beanshell PostProcessor là con của trình lấy mẫu trả về phản hồi html của bạn.
  2. Sử dụng đoạn mã sau vào PostProcessor (từ tập tin bên ngoài hoặc chèn vào trường "Script") để trích xuất và lưu các phím:

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


Sử dụng xpathExpr = "//table//tr/td/text()" sẽ cung cấp cho bạn tất cả các cột trong tất cả các hàng.
Để có thêm lựa chọn cụ thể, bạn có thể:

  • truy vấn đường dẫn tinh chỉnh, ví dụ: //table//tr/td[1]/text();
  • trích xuất tất cả các giá trị và sau đó lặp qua danh sách kết quả để có được những gì bạn cần chính xác.

Hy vọng điều này sẽ hữu ích.