自習用コンテンツ その5(https://automate.sct.co.jp/knowledge/12051/)の内容は如何でしたでしょうか?
簡単に出来てしまった方も、難しかった方もいたかと思います。
下記では、解説を書いていきます。
(解答例のコードは、ページ最下部に書いています。)
■観点
今回のコンテンツでは、Webページからのテーブルの抜き出し、およびチェックすべきチェックボックスの特定方法、を観点としました。
■1. 必要な変数の用意
今回は、以下の変数が必要となります。
・「組」の数字を格納する変数
・「番号」の数字を格納する変数
・「何件ヒットしたか」を格納する変数 → 初期値は「0件」なので、「0」をセット
<AMVARIABLE NAME="var_kumi" />
<AMVARIABLE NAME="var_num" />
<AMVARIABLE NAME="var_cnt" VALUE="0" />
■2. 対象のWebページを開く
処理対象のWebページを開きます。なお、表に書かれている番号は開くたびに変わります。
<AMBROWSER URL="https://www-1.sct.co.jp/amdemo/table-test.html" SESSION="BrowserSession1" />
■3. 表形式のデータ(tableタグ)をデータセットとして抽出
テーブルタグのデータをデータセットとして抽出・格納します。
※テーブルのデータ(TDタグ)を一つずつ抽出する方法は、要素数がずれやすくあまり推奨しません。
今回のページでは1ページにテーブルが1つしかありませんが、テーブルが複数あり、かつデータ数が可変のページだと要素数が大きくずれます。
<AMBROWSER ACTIVITY="extable" HTMLID="theNumbers" SESSION="BrowserSession1" RESULTDATASET="ds_numbers" />
■4. データセットの内容を順繰りにチェック
テーブルを取得した結果のデータセットは、以下のようになっています。
1行目は見出し行なので使用しません。そのため、データチェックはデータセットの2行目から行います。
(図1. データセット取得結果(先頭一部抜粋))
「Loop - データセット」を使用し、開始行を「2」に設定します。
<AMLOOP ACTIVITY="dataset" DATASET="ds_numbers" FROM="2" />
<AMLOOP ACTIVITY="end" />
---------------------------以下、ループ内部処理---------------------------
■5. 「組」「番号」を比較できるよう、数字以外を除去する
データセットに書かれているそのままのデータ「239組」「394番」は数字ではない文字列を含んでいるため、大小の比較が出来ません。
そのため、それぞれのデータから「組」「番」を除去したデータを変数に格納します。
特定の文字を全て除去(=Nothingに置換)するには、「テキスト - 置換」アクションを使用します。
<AMTEXT ACTIVITY="replace" TEXT="%ds_numbers.Column1%" FIND="組" REPLACE="" RESULTVARIABLE="var_kumi" />
<AMTEXT ACTIVITY="replace" TEXT="%ds_numbers.Column2%" FIND="番" REPLACE="" RESULTVARIABLE="var_num" />
■6. 組が301 - 400の間かつ番号が100未満の場合にチェックをつける
条件1:変数「var_kumi」が301以上かつ400以下
条件2:変数「var_num」が100未満
の場合に処理を実行するように組むには、「IF - 条件式」を使用します。
なお、条件1の内容を「301 <= var_kumi <= 400」のように記述することは出来ません。
必ず各条件「301 <= var_kumi」および「var_kumi <= 400」のように別々に書いて「AND」で繋げる必要があります。
上記を踏まえると、条件式は
%(301 <= var_kumi AND var_kumi <= 400) AND (var_num < 100)%
となります。
次に、上記の条件にヒットした場合、クリックすべきチェックボックスの特定方法を考えます。
まず、表における1行目のチェックボックスの要素を「Webブラウザ(従来) - クリック」の設定画面を使用して確認してみます。
そうすると、「図2」のように「名前」の部分に「chxbox0」と入っており、チェックボックスごとに名前が分かれていることが分かります。
(図2. 表1行目のチェックボックスの要素取得結果)
次に、表の10行目のチェックボックスの要素を取得してみます。
そうすると、「図3」のように「名前」に「chxbox9」と入っていることより、チェックボックスの名前は
固定文字列「chxbox」 + (表における実データの行番号から1を引いた数字)
という法則で作られていることが分かります。
(図3. 表10行目のチェックボックスの要素取得結果)
一方で、表から抽出して作成されたデータセットは見出し行を含んでいるので、実データの1行目はデータセットにおける2行目に該当します。
ゆえに、データセットにおける2行目(=実データの1行目)に対応するチェックボックスは、
固定文字列「chxbox」 + (データセットの処理中の行番号から2を引いた数字)
という図式が成り立ちます。
データセットの現在処理中の行は「%データセット名.CurrentRow%」で取得できる為、対応するチェックボックスは
「chxbox%ds_numbers.CurrentRow - 2%」
で表現可能です。
チェックボックスにチェックをつけた後、カウント用の変数を「変数 - 増加」アクションで1増やします。
<AMIF EXPRESSION="%(301 <= var_kumi AND var_kumi <= 400) AND (var_num < 100)%" USECOMPLEXUI="YES" />
<AMBROWSER ACTIVITY="click" HTMLNAME="chxbox%ds_numbers.CurrentRow - 2%" SESSION="BrowserSession1" />
<AMVARIABLE ACTIVITY="increment" RESULTVARIABLE="var_cnt" />
<AMIF ACTIVITY="end" />
---------------------------以上、ループ内部処理---------------------------
■7. チェックしたチェックボックスの個数または「該当なし」を表示
変数「var_cnt」が「0」か「それ以外」かで処理を分けます。
「If - 条件式」「If - Else」「ダイアログ」の3種のアクションを使用します。
「var_cnt」の値が「0」の場合は固定文字列「該当なし」を表示し、それ以外の場合(=Elseブロック)では変数「var_cnt」を表示させます。
<AMIF EXPRESSION="%var_cnt% = 0" />
<AMSHOWDIALOG MESSAGE="該当なし" />
<AMELSE />
<AMSHOWDIALOG>%var_cnt%件ヒットしました</AMSHOWDIALOG>
<AMIF ACTIVITY="end" />
今回定義する処理は以上になります。以下例ではWebブラウザにChromeを使用しています。
(処理構築例:展開するにはここをクリック)
<!--変数宣言-->
<AMVARIABLE NAME="var_kumi" DESCRIPTION="「組」の数字を格納する変数" VALUE="" />
<AMVARIABLE NAME="var_num" DESCRIPTION="「番」の数字を格納する変数" VALUE="" />
<AMVARIABLE NAME="var_cnt" VALUE="0" DESCRIPTION="条件に合致する行をカウントする変数" />
<!--対象ページを開き、テーブルタグを抽出してデータセット化-->
<AMWEBBROWSER URL="https://www-1.sct.co.jp/amdemo/table-test.html" SESSION="BrowserSession1" BROWSER="chrome" />
<AMWEBBROWSER ACTIVITY="extable" HTMLID="theNumbers" SESSION="BrowserSession1" RESULTDATASET="ds_numbers" />
<!--ヘッダー行は見なくてよい為、2行目から処理開始-->
<AMLOOP ACTIVITY="dataset" DATASET="ds_numbers" FROM="2" />
<!--数字の比較に際して不要な文字を削除し、変数に格納-->
<AMTEXT ACTIVITY="replace" TEXT="%ds_numbers.Column1%" FIND="組" REPLACE="" RESULTVARIABLE="var_kumi" />
<AMTEXT ACTIVITY="replace" TEXT="%ds_numbers.Column2%" FIND="番" REPLACE="" RESULTVARIABLE="var_num" />
<!--条件に合致する場合、チェックをつけてカウント用変数を増分-->
<AMIF EXPRESSION="%(301 <= var_kumi AND var_kumi <= 400) AND (var_num < 100)%" USECOMPLEXUI="YES" />
<!--固定文字列「chxbox」+ (データセットの現在処理中の行 - 2) がチェック対象のチェックボックス-->
<AMWEBBROWSER ACTIVITY="click" HTMLNAME="chxbox%ds_numbers.CurrentRow - 2%" SESSION="BrowserSession1" />
<AMVARIABLE ACTIVITY="increment" RESULTVARIABLE="var_cnt" />
<AMIF ACTIVITY="end" />
<AMLOOP ACTIVITY="end" />
<!--0件か、またはそれ以外かで分岐しメッセージ表示-->
<AMIF EXPRESSION="%var_cnt% = 0" />
<AMSHOWDIALOG MESSAGE="該当なし" />
<AMELSE />
<AMSHOWDIALOG>%var_cnt%件ヒットしました</AMSHOWDIALOG>
<AMIF ACTIVITY="end" />