チュートリアル2ー1
チュートリアル1を改良して、結果が複数ページに渡るケースを操作します。
改良内容
対象サイトは、検索画面でアルファベットだけを入れた場合、該当する番号全体が表示されます。
表示できない分は、次ページ以降で表示されるようになっています。
前回の復習
前回のチュートリアルを参考に、検索画面から結果画面・エラー画面の基本的な枠組みを作成します。
エラー画面へ遷移する操作を作成します。
サイトを開く
対象サイトのURLを入力します。
IO | TYPE | 入力オプション |
---|---|---|
IN | Browser:URL | URL:https://www.jisc.go.jp/app/jis/general/GnrJISSearch.html |
検索画面
テキストボックスへの入力
IO | TYPE | XPath | 入力オプション | Fixed | 入力値 |
---|---|---|---|---|---|
IN | Element:TEXT | //input[@id="label-f01"] | 入力前クリア | True | A |
入力する内容はいったん「A」固定とします。
検索ボタン
IO | TYPE | XPath | 入力オプション | Fixed | 入力値 |
---|---|---|---|---|---|
IN | Element:BUTTON | //form[@name="FORM2"]//div/input | オン値:CLICK | True | CLICK |
エラー画面
前回と同じく、結果画面での「規格番号」の有無で正常/エラーの判別をして、エラー時はエラーメッセージを出力します。
Ctrl | TYPE | XPath | 入力オプション | 内容 |
---|---|---|---|---|
IF | Element:LABEL | //th[contains(text(),'規格番号')] | 条件:表示 | 遷移先判断 |
(正常ケース) | ||||
ELSE | エラーケース | |||
Element:LABEL | //div[@class="message_"] | MSG取得 | ||
END-IF |
ここまでの内容です。
結果画面
検索結果は1ページに最大50件表示されます。以降は、ページ下部の「次へ」ボタンをクリックして取得します。
結果取得と次ページへの遷移をシナリオに組み込みます。
結果の取得
テーブルの内容を取得します。
IO | TYPE | XPath | 入力オプション | 列 | 行 |
---|---|---|---|---|---|
OUT | Element:TABLE | //table[@class="table-databese1"] | 出力先:新規シート、シート名:JIS_A | A | 1 |
XPathは「XPath取得ツール」、または「ブラウザの開発者ツール」で取得します。ブラウザの開発者ツールの場合は、XPathは「//*[@id="form"]/table」となります。
出力先シートは、別シートにして、最終的にはJIS番号のアルファベット毎にシートを分ける予定です。なので、シート名にアルファベットを入れておきます。
次ページへの遷移
「次へ」ボタンをクリックします。
IO | TYPE | XPath | 入力オプション | Fixed | 入力値 |
---|---|---|---|---|---|
IN | Element:Button | //a[contains(text(),'次へ')] | オン値:CLICK | True | CLICK |
次ページ以降の結果取得
1ページ目でExcelシート「JIS_A」に出力した後、2ページ目は「JIS_A」の次の行から出力する必要があります。また、結果テーブルのヘッダー【規格番号、規格名称】は、1ページ目だけ出力すればよいです。
まずは、出力結果の取得を、ヘッダーと内容に区別します。このテーブルは、ヘッダー<thead>とボディ<tbody>に分かれているので、それぞれの内容を取得するようにします。
IO | TYPE | XPath | 入力オプション | 列 | 行 |
---|---|---|---|---|---|
IN | NUM:SUBSTITUTE | 変数名:^row、代入式:2 | |||
OUT | //table[@class="table-databese1"]/thead | 出力先:新規シート、シート名:JIS_A | A | 1 | |
OUT | //table[@class="table-databese1"]/tbody | 出力先:新規シート、シート名:JIS_A | A | ^row |
Excelの行を表す変数「^row」を宣言します。
ループ処理
繰り返しの処理を組み込みます。
ループの継続条件
「最後へ」ボタンを手動でクリックして、一番最後の画面に遷移します。
一般的なサイトでは、最終画面では、画面下部の「次へ」や「最後へ」ボタンは無効になっていることが多いのですが、この画面はそうではありません。だから「次へ」や「最後へ」ボタンでループ終了の判断はできません。
左側の件数表示「622件中601~622件を表示」で判断することは可能です。
左側の622件(合計件数)と、右側の現在の件数を取り出し、件数が一致するまで繰り返しを続ける方法で実現できますが、INSTR関数と、LEFT関数/MIDDLE関数を組み合わせる必要があり、少々面倒くさいです。
画面上部に注目すると、ブラウザのURLが「https://www.jisc.go.jp/app/jis/general/GnrJISNumberNameSearchList?research&pageNo=13」
となっており、pageNo=13で現在のページを表しています。
試しに「次へ」ボタンをクリックしても、URLは変わりません。なので、ループの終了条件は、「次へ」ボタンを押してもURLが変わらないこと、
継続条件としては、「次へ」ボタンをクリックして、遷移先のURLが変わる間、繰り返し処理を続けるということになります。
Ctrl | IO | TYPE | 変数 | 入力オプション | |
---|---|---|---|---|---|
1 | IN | STR:SUBSTITUTE | 変数名:^URL、代入式: | ||
2 | WHILE | URL | [文言:^URL] | 条件:文言不一致、文言:^URL | |
3 | OUT | Browser:URL | |||
4 | IN | STR:LAST-VALUE | 変数名:^URL | ||
5 | OUT | TABLE内容の出力 | |||
6 | IN | 「次へ」ボタンをクリック | |||
7 | WEND |
WHILE文の流れ
Excel行の調整
繰り返しの中では、出力件数に応じてExcelの行を進めます。
出力件数は、結果画面の「表の行数」です。表の行のXPathは
//table[@class="table-databese1″]/tbody/tr[1] ~ //table[@class="table-databese1″]/tbody/tr[50]
と、最大50件までカウント表示されます。
行が何件あるかを知りたいので、要素の個数を出力する【TYPE:FIND-ELEMENT】を使用して、
「//table[@class="table-databese1″]/tbody/tr」で検索できる要素が何件あるかを調べます。
Ctrl | IO | TYPE | 変数 | XPath | 入力オプション | 列:行 |
---|---|---|---|---|---|---|
OUT | TABLEヘッダーの出力 | A:1 | ||||
IN | NUM:SUBSTITUTE | 変数名:^row、 代入式:2 | ||||
WHILE | ||||||
OUT | TABLEの出力 | A:^row | ||||
OUT | Element:FIND-ELEMENT | //table[@class="table-databese1"]/tbody/tr | ||||
IN | NUM:LAST-VALUE | 変数名:^add | ||||
IN | NUM:SUBSTITUTE | [代入式:^add] | 変数名:^row、 代入式:^row+^add | |||
WEND |
件数カウント用の変数「^add」に、FIND-ELEMENTの結果を代入し、Excel行数を管理する変数「^row」に加算します。こうすることで、1回のループ内処理が終わった時に「Excelの行数」を「表の行数」と同じだけ進めることができます。
WHILE処理
Ctrl | IO | TYPE | 変数 | XPath | 入力オプション | 列:行 |
---|---|---|---|---|---|---|
OUT | TABLEヘッダーの出力 | A:1 | ||||
IN | NUM: SUBSTITUTE | 変数名:^row、 代入式:2 | ||||
IN | STR: SUBSTITUTE | 変数名:^URL、 代入式: | ||||
WHILE | URL | [文言:^URL] | 条件:文言不一致、 文言:^URL | |||
OUT | Browser: URL | |||||
IN | STR: LAST-VALUE | 変数名:^URL | ||||
OUT | TABLEの出力 | A:^row | ||||
OUT | Element: FIND-ELEMENT | //table[@class="table-databese1"]/tbody/tr | ||||
IN | NUM: LAST-VALUE | 変数名:^add | ||||
IN | NUM: SUBSTITUTE | [代入式:^add] | 変数名:^row、 代入式:^row+^add | |||
IN | 「次へ」ボタンをクリック | |||||
WEND |
作成シナリオ
シナリオのIF文内に、WHILE処理を反映させます。
シナリオ実行
Excelタブで、出力先のExcelシートを適当に設定してから、シナリオを実行します。
終了結果
最終ページが表示されています。ループ回数は13回、Excelのカレント行は624です。
Excel結果
「JIS_A」という名前のシートに、先頭行だけヘッダー「規格番号、規格名称」が記載されています。
ブラウザ画面の総件数622件に対し、ヘッダー行を合わせた623行で終わっています。