java - Jmeter 中的 Jtidy StringIndexOutOfBoundsException

标签 java xpath jmeter jtidy tag-soup

我想使用 JMeter 从网页中检索内容。
我正在寻找的数据在一个 javascript block 中:

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

假设我想在 map id=id1 的脚本 block 中获取 name 变量的值,
其中还有一个song变量。

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

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

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

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

问题:

问题是:我的 HTML 包含奇怪的国际字符 wé hà bêêê...(是的,法语,对此感到抱歉)并且 Jtidy 无法正确处理这种特殊情况:bug #205 StringIndexOutOfBoundsException while lexing script content

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

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

我的解决方案:

我使用 tagsoup java 库来清理 HTML 输出并将其存储在 JMeter 变量中,然后通过 Xpath 处理该变量(勾选“应用到”中的“JMeter 变量”选项),最后我使用正则表达式来获取我的 Lionel Richie 东西工作...

JMeter |->HTTP请求 |->BeanShell 后处理器->tagsoup > var RESPONSE |->Xpath 提取器,应用于 var RESPONSE > var XPATH_OUTPUT |->正则表达式提取器,应用于 var XPATH_OUTPUT

要让 tagsoup 与 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);

最佳答案

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

(?s)var name="([^"]+?)";.+?var song=

它使用单行模式:

参见: enter image description here

关于java - Jmeter 中的 Jtidy StringIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39099654/

相关文章:

java - Selenium:如何验证菜单下拉文本?

api - 使用jMeter对SAP oData进行身份验证

java - Jmeter Http 代理服务器抛出 java.net.URISyntaxException : Illegal character in query at index error

java - 如何在hibernate中映射外键关系

java - JBoss 从 JBoss AS 4.2 GA 迁移到 JBoss EAP 6.2

java - GLSurfaceView 在 Activity 被销毁后导致 ANR

java - 慢速 Java Swing 菜单的解决方法

xml - Xpath-选择多个值(键值对)

xml - Xpath获取所有子孙值的总和

variables - 在变量内部使用变量时遇到问题