Jmeter

时间:2016-08-23 11:15:26

标签: java xpath jmeter jtidy tag-soup

我想使用JMeter从网页中检索内容 我正在寻找的数据位于javascript块中:

(...)
<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>
(...)

假设我想在地图id = id1中的脚本块中包含name变量的值,
其中一个song变量。

我使用XPath Extractor来获取脚本内容(CSS / Jquery不会获取javascript内容,因为它不是纯HTML):

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

XPath不会找到数据,因为我的HTML很脏(一些标签结尾缺少的东西等等......)所以我需要使用Jtidy清理它(使用“Tidy(宽容解析器) “选项)

备注:
- 我不拥有我正在处理的网页。我必须处理这个可怕的HTML - 网页中有许多maps元素,每个元素都有一个带song变量的脚本:我不能直接使用regexp(据我所知)

问题:

问题是:我的HTML包含奇怪的国际字符wéhàbêêêê ...(是的,法语,对不起),Jtidy没有正确处理这个特殊情况:{{3} }

结果Xpath提取器失败,我的整个测试计划被卡住了。

我设计了一个自定义解决方案,但我发现它有点复杂。 也许我能以更好的方式处理这个问题。

我的解决方案:

我使用了tagoup java库来清理HTML输出并将其存储在JMeter变量中,然后通过Xpath处理(在“Apply to”中勾选“JMeter变量”选项),最后我使用regexp来获取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

要让tagoup与JMeter一起使用,只需将jar放在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);

1 个答案:

答案 0 :(得分:1)

Regular Expression Extractor与以下正则表达式一起使用:

  

(?s)var name =“([^”] +?)“;。+?var song =

它使用单行模式:

请参阅: enter image description here