Jmeter 中的 Jtidy StringIndexOutOfBoundsException
Jtidy StringIndexOutOfBoundsException in Jmeter
我想使用 JMeter 从网页中检索内容。
我要查找的数据位于 java 脚本块内:
(...)
<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 无法获取 java 脚本内容,因为它不纯 HTML):
.//map[@id='id1']/script[contains(.,'song')]
XPath 找不到数据,因为我的 HTML 很脏(一些缺少标记结尾的乱七八糟的东西等等......)所以我需要使用 Jtidy 清理它(使用 "Tidy(tolerant parser)" 选项)
备注:
- 我不拥有我正在处理的网页。我必须处理这个可怕的 HTML.
- 网页中有许多 maps
元素,每个元素都有一个带有 song
变量的脚本:我不能直接使用正则表达式(据我所知)
问题:
问题是:我的 HTML 包含奇怪的国际字符 wé hà bêêê...(是的,法语,抱歉)并且 Jtidy 无法处理正确地这个特殊情况:bug #205 StringIndexOutOfBoundsException while lexing script content
结果 Xpath 提取器失败,我的整个测试计划被卡住了。
我设计了一个自定义解决方案,但我发现它有点复杂。
也许我可以用更好的方式处理这件事。
我的解决方案:
我使用 tagsoup java 库来清理 HTML 输出并将其存储在 JMeter 变量中,然后通过 Xpath 处理该变量(勾选 "Apply to" 中的 "JMeter variable" 选项)最后我使用正则表达式让我的 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 一起工作,只需将 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=
它使用单行模式:
参见:
我想使用 JMeter 从网页中检索内容。
我要查找的数据位于 java 脚本块内:
(...)
<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 无法获取 java 脚本内容,因为它不纯 HTML):
.//map[@id='id1']/script[contains(.,'song')]
XPath 找不到数据,因为我的 HTML 很脏(一些缺少标记结尾的乱七八糟的东西等等......)所以我需要使用 Jtidy 清理它(使用 "Tidy(tolerant parser)" 选项)
备注:
- 我不拥有我正在处理的网页。我必须处理这个可怕的 HTML.
- 网页中有许多 maps
元素,每个元素都有一个带有 song
变量的脚本:我不能直接使用正则表达式(据我所知)
问题:
问题是:我的 HTML 包含奇怪的国际字符 wé hà bêêê...(是的,法语,抱歉)并且 Jtidy 无法处理正确地这个特殊情况:bug #205 StringIndexOutOfBoundsException while lexing script content
结果 Xpath 提取器失败,我的整个测试计划被卡住了。
我设计了一个自定义解决方案,但我发现它有点复杂。 也许我可以用更好的方式处理这件事。
我的解决方案:
我使用 tagsoup java 库来清理 HTML 输出并将其存储在 JMeter 变量中,然后通过 Xpath 处理该变量(勾选 "Apply to" 中的 "JMeter variable" 选项)最后我使用正则表达式让我的 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 一起工作,只需将 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=
它使用单行模式:
参见: