チュートリアル2ー1

2022年12月9日

チュートリアル1を改良して、結果が複数ページに渡るケースを操作します。

改良内容

対象サイトは、検索画面でアルファベットだけを入れた場合、該当する番号全体が表示されます。

検索画面

表示できない分は、次ページ以降で表示されるようになっています。

結果画面

前回の復習

前回のチュートリアルを参考に、検索画面から結果画面・エラー画面の基本的な枠組みを作成します。

エラー画面へ遷移する操作を作成します。

サイトを開く

対象サイトのURLを入力します。

IOTYPE入力オプション
INBrowser:URLURL:https://www.jisc.go.jp/app/jis/general/GnrJISSearch.html
JIS検索サイトを開く

検索画面

テキストボックスへの入力

IOTYPEXPath入力オプションFixed入力値
INElement:TEXT//input[@id="label-f01"]入力前クリアTrueA
JIS番号入力

入力する内容はいったん「A」固定とします。

検索ボタン

IOTYPEXPath入力オプションFixed入力値
INElement:BUTTON//form[@name="FORM2"]//div/inputオン値:CLICKTrueCLICK
検索ボタンクリック

エラー画面

前回と同じく、結果画面での「規格番号」の有無で正常/エラーの判別をして、エラー時はエラーメッセージを出力します。

CtrlTYPEXPath入力オプション内容
IFElement:LABEL//th[contains(text(),'規格番号')]条件:表示遷移先判断
(正常ケース)
ELSEエラーケース
Element:LABEL//div[@class="message_"]MSG取得
END-IF
エラー画面

ここまでの内容です。

結果画面

検索結果は1ページに最大50件表示されます。以降は、ページ下部の「次へ」ボタンをクリックして取得します。
結果取得と次ページへの遷移をシナリオに組み込みます。

結果の取得

テーブルの内容を取得します。

IOTYPEXPath入力オプション
OUTElement:TABLE//table[@class="table-databese1"]出力先:新規シート、シート名:JIS_AA1
結果の取得

XPathは「XPath取得ツール」、または「ブラウザの開発者ツール」で取得します。ブラウザの開発者ツールの場合は、XPathは「//*[@id="form"]/table」となります。

出力先シートは、別シートにして、最終的にはJIS番号のアルファベット毎にシートを分ける予定です。なので、シート名にアルファベットを入れておきます。

次ページへの遷移

「次へ」ボタンをクリックします。

IOTYPEXPath入力オプションFixed入力値
INElement:Button//a[contains(text(),'次へ')]オン値:CLICKTrueCLICK
次へボタンクリック

次ページ以降の結果取得

1ページ目でExcelシート「JIS_A」に出力した後、2ページ目は「JIS_A」の次の行から出力する必要があります。また、結果テーブルのヘッダー【規格番号、規格名称】は、1ページ目だけ出力すればよいです。

まずは、出力結果の取得を、ヘッダーと内容に区別します。このテーブルは、ヘッダー<thead>とボディ<tbody>に分かれているので、それぞれの内容を取得するようにします。

IOTYPEXPath入力オプション
INNUM:SUBSTITUTE変数名:^row、代入式:2
OUT//table[@class="table-databese1"]/thead出力先:新規シート、シート名:JIS_AA1
OUT//table[@class="table-databese1"]/tbody出力先:新規シート、シート名:JIS_AA^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が変わる間、繰り返し処理を続けるということになります。

CtrlIOTYPE変数入力オプション
1INSTR:SUBSTITUTE変数名:^URL、代入式:
2WHILEURL[文言:^URL]条件:文言不一致、文言:^URL
3OUTBrowser:URL
4INSTR:LAST-VALUE変数名:^URL
5OUTTABLE内容の出力
6IN「次へ」ボタンをクリック
7WEND
WHILE文の流れ
1: URLを保持する変数「^URL」を宣言します。
2: WHILE部では、現在のURLと「^URL」の中身を比較します。
3,4: 今回分のURLを「^URL」に代入します。
6: 「次へ」ボタンをクリックし、次ページに遷移します。
2: 現在のURLと「^URL(前ページ)」を比較し、異なる間は処理を繰り返します。

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」で検索できる要素が何件あるかを調べます。

CtrlIOTYPE変数XPath入力オプション列:行
OUTTABLEヘッダーの出力A:1
INNUM:SUBSTITUTE変数名:^row、
代入式:2
WHILE
OUTTABLEの出力A:^row
OUTElement:FIND-ELEMENT//table[@class="table-databese1"]/tbody/tr
INNUM:LAST-VALUE変数名:^add
INNUM:SUBSTITUTE[代入式:^add]変数名:^row、
代入式:^row+^add
WEND

件数カウント用の変数「^add」に、FIND-ELEMENTの結果を代入し、Excel行数を管理する変数「^row」に加算します。こうすることで、1回のループ内処理が終わった時に「Excelの行数」を「表の行数」と同じだけ進めることができます。

WHILE処理

CtrlIOTYPE変数XPath入力オプション列:行
OUTTABLEヘッダーの出力A:1
INNUM:
SUBSTITUTE
変数名:^row
代入式:2
INSTR:
SUBSTITUTE
変数名:^URL
代入式:
WHILEURL[文言:^URL]条件:文言不一致、
文言:^URL
OUTBrowser:
URL
INSTR:
LAST-VALUE
変数名:^URL
OUTTABLEの出力A:^row
OUTElement:
FIND-ELEMENT
//table[@class="table-databese1"]/tbody/tr
INNUM:
LAST-VALUE
変数名:^add
INNUM:
SUBSTITUTE
[代入式:^add]変数名:^row
代入式:^row+^add
IN「次へ」ボタンをクリック
WEND

作成シナリオ

シナリオのIF文内に、WHILE処理を反映させます。

シナリオ実行

Excelタブで、出力先のExcelシートを適当に設定してから、シナリオを実行します。

出力Excelシート設定
シナリオ実行中
終了結果
シナリオ終了

最終ページが表示されています。ループ回数は13回、Excelのカレント行は624です。

Excel結果
Excelシート(先頭)

「JIS_A」という名前のシートに、先頭行だけヘッダー「規格番号、規格名称」が記載されています。

Excelシート(最後)

ブラウザ画面の総件数622件に対し、ヘッダー行を合わせた623行で終わっています。