2016-08-23 75 views
2

我想使用JMeter從網頁中檢索內容。
我正在尋找的數據是一個JavaScript塊中:Jmeter中的Jtidy StringIndexOutOfBoundsException

(...) 
<map id="id1"> 
    <script type="text/javascript"> 
    var name="Lionel Richie"; 
    var song="Hello"; 
    var lyrics="Is it me you're looking for ?"; 
    </script> 
(...) 
    <script type="text/javascript"> 
    var name="Waldo"; 
    </script> 
</map> 
(...) 

比方說,我想name變量在地圖上標識的腳本塊內的值= ID1,
那裏的一個song變量。

我使用XPath的提取,以獲得腳本內容(CSS/jQuery將無法獲得的JavaScript內容,因爲它不是純HTML):

.//map[@id='id1']/script[contains(.,'song')]

的XPath將無法找到數據,因爲我HTML是髒的(一些野生的東西缺少結束標記等等......)所以我需要把它清理乾淨使用Jtidy(使用「整潔(寬容解析器)」選項)

備註:
- 我沒有擁有正在處理的網頁。我必須處理這個可怕的HTML。
- 有在他們每個人具有與song變量的腳本的網頁許多maps元素:我不能直接使用正則表達式(據我所知)

問題:

問題是:我的HTML包含怪異的國際字符我們Hàbêêêê ...(是的,法國的,我們對此深感抱歉)和Jtidy不能正確處理這種特殊情況:bug #205 StringIndexOutOfBoundsException while lexing script content

結果的Xpath提取失敗,我的整個測試計劃卡住了。

我設計了一個自定義解決方案,但是我覺得它有點複雜。 也許我可以更好地處理這個問題。

我的解決辦法:

我用tagsoup Java庫清潔HTML輸出並將其存儲在一個JMeter的變量,然後通過Xpath的處理(勾選「JMeter的變量」選項「應用到」),最後我用正則表達式讓我Lionel Richie的東西的工作...

JMeter |->HTTP Request |->BeanShell PostProcessor->tagsoup > var RESPONSE |->Xpath Extractor, Apply to var RESPONSE > var XPATH_OUTPUT |->Regular Expression Extractor, Apply to var XPATH_OUTPUT

要獲得tagsoup用JMeter的工作,只是把罐子lib目錄中,然後用的BeanShell PostProcessor中。使用

BeanShell的代碼:

import org.xml.sax.*; 
import org.ccil.cowan.tagsoup.*; 

// getting response data of previous sampler 
String rep=prev.getResponseDataAsString(); 

XMLReader r = new Parser(); 
HTMLSchema theSchema = new HTMLSchema(); 
r.setProperty(Parser.schemaProperty, theSchema); 
ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 

Writer w = new OutputStreamWriter(outStream); 

XMLWriter x = new XMLWriter(w); 
x.setPrefix(theSchema.getURI(), ""); 

r.setContentHandler(x); 

r.parse(new InputSource(new StringReader(rep))); 

String encodedRep=outStream.toString("UTF-8"); 

vars.put("RESPONSE", encodedRep); 
+0

你可以嘗試使用正則表達式? –

回答