JMeter を使用して Web ページからコンテンツを取得したいと考えています。
私が探しているデータは、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>
(...)
変数がname
あるマップ id=id1 のスクリプト ブロック内の変数の値が必要だとしましょう。 song
XPath Extractor を使用してスクリプト コンテンツを取得します (純粋な HTML ではないため、CSS/Jquery は JavaScript コンテンツを取得しません)。
.//map[@id='id1']/script[contains(.,'song')]
私のHTMLが汚れているため(タグの末尾が欠落しているワイルドなものなど...)、XPathはデータを見つけられないので、Jtidyを使用してクリーンアップする必要があります(「Tidy(寛容なパーサー)」オプションを使用します)
備考 :
- 私は処理中の Web ページを所有していません。この恐ろしい HTML に対処しなければなりません。
- Webページには多くのmaps
要素があり、それぞれに変数を持つスクリプトがありsong
ます:正規表現を直接使用することはできません(私の知る限り)
問題 :
問題は次のとおりです。私の HTML には奇妙な国際文字wé hà bêêêêが含まれています... (はい、フランス語、申し訳ありません)。Jtidy はこの特定のケースを適切に処理しません:バグ #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
JMeter で tagsoup を動作させるには、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);