2

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);
4

1 に答える 1

1

次の正規表現で正規表現エクストラクタを使用します。

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

単一行モードを使用します。

見る: ここに画像の説明を入力

于 2016-08-23T20:55:57.083 に答える