我想使用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);
你可以嘗試使用正則表達式? –