SELECTタグが複数あり、OPTIONのバリューをランダムで取りたい場合について解説します。
想定シチュエーションと課題
下記のように、複数のSELECTタグが使われている場合を想定しています。
情報Aについて選択
<select name="infoA">
<option value="1">情報A1</option>
<option value="2" selected="selected">情報A2</option>
<option value="3">情報A3</option>
</select>
情報Bについて選択
<select name="infoB">
<option value="1">情報B1</option>
<option value="2" selected="selected">情報B2</option>
<option value="3">情報B3</option>
</select>
通常であれば、下記のような正規表現抽出で一致番号を「0」にすることで、情報をランダムで取得ができます。
<option value="(.*)">(.*)</option>
しかしながら、SELECTタグが複数あるため、想定外のSELECTタグの情報がとれてしまいます。
BeanShellPostProcessorを使って取得
正規表現抽出はあきらめて、BeanShellPostProcessorを使って取得してみます。
ソース的にはselected部分を取得していますが、ランダムに情報を取得する等、用途に応じて修正してもらえれば良いかと思います。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
String body = prev.getResponseDataAsString();
String[] lines = body.split("\n");
Pattern findTitle = Pattern.compile("<select name=\"infoA\">");
Pattern findSelected = Pattern.compile("selected");
Pattern findSelectClose = Pattern.compile("</select>");
Pattern findValue = Pattern.compile("value=\"(.*?)\"");
Pattern findLabel = Pattern.compile("value=\"(.*)\">(.*?)</");
boolean targetRange = false;
for(String line: lines){
// 対象範囲の特定
Matcher title = findTitle.matcher(line);
if(title.find() || targetRange){
// log.info(line);
targetRange = true;
// selectedの特定
Matcher selected = findSelected.matcher(line);
if(selected.find()){
Matcher label = findLabel.matcher(line);
Matcher value = findValue.matcher(line);
if(label.find() && value.find()){
// 変数に格納
// log.info(label.group(1) +","+value.group(1));
vars.put("value",value.group(1));
vars.put("label",label.group(2));
break;
}
}
}
}
まとめ
正規表現では取得しにく、SELECTタグが複数ある場合のオプション属性の取得方法についてまとめてみました。
ほかにも良い方法がある気がするので、もしあればコメントいただけると嬉しいですmm