2016-08-23 7 views
2

Я хочу получить контент с веб-страницы с помощью JMeter.
данные Я ищу находится внутри яваскрипта блока:Jtidy StringIndexOutOfBoundsException в Jmeter

(...) 
<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 внутри блока сценария в карте ID = ID1,
где есть также a song переменная.

Я использую XPath экстрактор, чтобы получить содержание сценария (CSS/Jquery не получит яваскрипт содержания, как это не чистый HTML):

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

XPath не найти данные, потому что мой HTML загрязнен (некоторые дикие вещи с отсутствующим тегом заканчивается, и так далее ...), поэтому мне нужно, чтобы очистить его с помощью Jtidy (Использовать «Tidy (терпим анализатор)» опции)

Примечания:
- Я не владею веб-страницей, которую обрабатываю. Мне приходится иметь дело с этим отвратительным HTML.
- есть много maps элементов в веб-страницы каждого из них, имеющего сценарий с song переменной: Я не могу напрямую использовать регулярное выражение (насколько я знаю)

Проблема:

Проблема это: мой HTML содержит странные международные символы HÀ бееее WE ... (да, французский, жаль, что) и 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 постпроцессора.

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

Вы можете попробовать использовать Regex? –

ответ