チュートリアル2-2
概要
前回作成したシナリオは検索ワードがAでしたが、AーZまで対応します。
なお、I,J,N,O,U,Vは欠番なので、エラー画面のメッセージを取得します。
Excelシート
シートの1枚目にA~Zまで記入します。検索にヒットした場合は、別シートに検索結果を出力します。エラー時は、検索ワードの横にエラーメッセージを出力します。
Excelのイメージ
A | B | |
---|---|---|
1 | A | |
2 | B | |
3 | C | |
9 | I | エラー内容 |
10 | J | エラー内容 |
25 | Y | |
26 | Z |
シナリオ改良
入力シートの指定
Excelタブで先ほどのシートを入力シートに指定します。
検索ワードの取得
ExcelのA列に値がある間、検索処理を繰り返します。繰り返しの回数(アルファベット26文字)が分かっているので、FOR-NEXTを使用します。
前回のシナリオの先頭部分を変更します。
Ctrl | IO | TYPE | 入力オプション | 列 | 行 |
---|---|---|---|---|---|
FOR | カウンター:^i、開始値:1、終了値:26、STEP:1 | ||||
IN | 検索画面のURLをセット | ||||
IN | TEXT | 入力前クリア | A | ^i | |
IN | ボタンクリック | ||||
NEXT |
- FOR文を宣言し、Excel入力シートの行を変数「^i」で管理します。「^i」の取る値は1~26です。
- 検索テキストボックスの入力値を、固定値「A2」から、セルの値「A列の^i行」に変更します。
なお、チュートリアル1では、検索画面の再表示は、ブラウザの戻る機能で実施しました。今回は、結果画面が複数ページに渡り、1回Backしただけでは、検索画面まで戻れないので、毎回URLをセットするようにします。
エラーMSG出力
エラーメッセージの出力セルが「A2」となっているので、B列に変更します。
Ctrl | IO | TYPE | XPath | 列 | 行 |
---|---|---|---|---|---|
ELSE | |||||
IN | NUM:SUBSTITUTE | //div[@class="message_"] | B | ^i | |
END-IF |
変数「^i」はExcel入力シートの行を保持しています。
出力シート名のセット
出力シート名が「JIN_A」と固定値となっています。変数を利用するようにします。
IO | TYPE | 変数 | 入力オプション | 列 | 行 | 内容 |
---|---|---|---|---|---|---|
IN | STR: SUBSTITUTE | 変数名:^str1、 セルで指定 | A | ^i | 入力値保存 | |
OUT | TABLE | [シート名:^str1] | 出力先:新規シート、 シート名:JIS_^str1 | A | 1 | ヘッダ出力 |
OUT | TABLE | [シート名:^str1] | 出力先:新規シート、 シート名:JIS_^str1 | A | ^row | 表の出力 |
改良シナリオ
シナリオ実行
完成したシナリオを実行します。
先頭のFORでカウンター「^i(入力シートの行数)」が加算され、2回目の検索テキストボックスには「B」が入力されています。
問題
「W」は本来は10件なのですが、20件出力されています。
同じ内容が重複して出力されています。最終ページの判定は、「次へ」ボタンをクリックした時に、ブラウザのURLが変更されるかどうかで判定していました。
原因の調査
検索画面に「W」を手動で入力し、結果画面を表示します。
「次へ」ボタンをクリックします。
表示される内容は同じですが、URLが変わっています。
初期表示:https://www.jisc.go.jp/app/jis/general/GnrJISNumberNameSearchList?show
2回目:https://www.jisc.go.jp/app/jis/general/GnrJISNumberNameSearchList?research&pageNo=1
なお、「A」など、2ページ目以降があるばあいは、「次へ」ボタンを押した後のURLは
「https://www.jisc.go.jp/app/jis/general/GnrJISNumberNameSearchList?research&pageNo=2」と「pageNo」が「2,3,4,5…」と順番に増えていきます。
対応策
「次へ」ボタンをクリックすると、URLの最後は
- 結果が1ページだけの場合は:常に「pageNo=1」
- 2ページ以上の場合:「pageNo=2,3,4….」
となります。
ですから、「次へ」ボタンをクリックして、URLの最後が「pageNo=1」であれば、最終ページと判断できます。
シナリオ修正
上記の内容を反映します。ついでに、正常時には入力値の隣に件数を出力するようにします。
ループ条件の追加
URLの最後が「pageNo=1」であれば、「BREAK」でWHILE文を終了する処理を入れます。
BREAKする条件は、変数「^URL」の右から8文字が「pageNo=1」の場合です。
Ctrl | IO | TYPE | 入力オプション |
---|---|---|---|
IN | STR:LAST-VALUE | 変数名:^URL | |
IN | STR:RIGHT | ^page=RIGHT(^URL, 8) | |
IF | VAR-STR | 条件:文言一致、変数名:^page、文言:pageNo=1 | |
BREAK | |||
END-IF |
- URLを保持している変数「^URL」から、「RIGHT」で後ろから8文字を切り出し、変数「^page」に代入します。
- IF文で、「^page」の値が「pageNo=1」であれば、「BREAK」でループから脱出します。
件数出力
結果画面が表示されたタイミングで、画面右下の「xxx件中xx~xx件を表示」を取得し、先頭の数字部分を出力します。
IO | TYPE | 変数 | XPath | 入力オプション | Fixed/ 列:行 |
---|---|---|---|---|---|
OUT | LABEL | //div[@class="page-navi"]//p | True | ||
IN | STR: LAST-VALUE | 変数名:^cnt | |||
OUT | STR:INSTR | 文字(元):^cnt、 数値(新):^len、 文言:件中 | |||
IN | STR:LEFT | [文字数:^len] | ^cnt=LEFT(^cnt, ^len-1) | ||
OUT | STR:OUTPUT | 変数名:^cnt | B:^i |
- LABELから文言を取得し、変数「^cnt」に代入します。
- 「INSTR」で、「^cnt(xxx件中xx~xx件を表示)」で「件中」が現れる文字位置を、数値型変数「^len」に保存します。
- 「LEFT」で、「^cnt」から、「件中」の直前(^len – 1)までを切り出して、^cntに上書きします。
- Excel出力シート、B列「^i」行目に「^cnt」の値を出力します。
修正シナリオ(最終版)
実行結果
「AーZ」に対し、正常時は件数とExcelシート、エラー時はエラーMSGが出力されています。
シート「JIS_W」についても、重複することなく出力されています。