CoopelでRPAチャレンジ！

# はじめに
この記事は、[RPA（ロボティック・プロセス・オートメーション） Advent Calendar 2022](https://qiita.com/advent-calendar/2022/robotic_process_automation)の12月20日分の記事となります。

RPAツールを試す際に、必ず最初に[RPAチャレンジ！](https://www.rpachallenge.com/?lang=ja)をやってみることにしています。
この辺りは、初めて使用したRPAツールがUiPathだったことが影響しているのかもしれません。

ちなみに、これまでにRPAチャレンジ！をやってみたツールは、
* UiPath(クラシック)
* UiPath(モダン)
* Power Automate for Desktop
* Automation Anywhere
* WinActor

です。そして今回、Coopelを使って、RPAチャレンジ！をやってみました。

# Coopelとは？
[Coopel](https://coopel.ai/)（クーペルと呼びます）は、クラウド型のノーコードRPAツールです。
提供しているのは、株式会社ディー・エヌ・エーです。わがDeNAベイスターズの親会社です(笑)

料金は、1アカウントあたり、5,400円/月となっていて、1アカウントで2シナリオを同時実行可能です。
また、この料金のみで、スケジュール実行も可能です。
さらに、契約は月単位のため、短期間のみの利用なども可能です。
（年単位での契約となるRPAツールが多い中、メリットとなる部分かもしれません）

ちなみに、30日間の無料お試し期間もあるので、興味のある方はぜひ触ってみてください。
なお、今回の記事では、Coopelの使い方に関する部分には触れません。あしからず。

# RPAチャレンジ！とは
RPAチャレンジは、以下のような画面に対して、Excelファイルに格納されているデモ用の顧客データを登録していくというものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/2b445857-a2b6-caf6-42fd-77a93eb3b5d1.png)
Excelはこんなものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/b3d015c5-ca9b-1bb6-0ae4-2b2a68034eab.png)
見ての通り、簡単な処理なのですが、RPAツールにおける3つの基本的なことが学べます。
* Excelからの読み込み
* ブラウザを介した画面操作
* 繰り返し処理

そして、このブラウザを介した画面操作に、色々な罠が仕掛けられているのが、このチャレンジの面白いところです。

# Excelからの読み込み
まず、Excelからデータを読み込む部分を作ります。

## Excelを開く
まずExcelファイルを開きます。
使うアクションは「ファイルを開く」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/1bf0d3f1-b97b-0ee3-bac0-55dc73060114.png)
「ファイルを開く」アクションの設定で、対象ファイルを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/dc49b13a-485e-4c4b-32aa-ea83a8796fe7.png)

## シートの指定
次に、読み込むシートを指定します。
使うアクションは「シートをシート名で指定」です。「シートをシート番号で指定」でもオッケーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/d7910a23-874b-2e40-08fb-3be611969854.png)
アクションの設定で、対象ファイルを指定します。この時、対象ファイルの横のExcelマークをクリックすると、対象となるファイル（先ほど設定した「ファイルを開く」アクションの結果）を簡単に設定することができます。
続いて、シート名に読み込む対象となるシート名を設定します（シート番号で指定アクションの場合は1）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/6eed1f2e-ccbd-6231-9c3c-be9295241c87.png)

## 読み込み
次に、対象シートからデータを読み込みます。
使うアクションは「セルをコピー」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/96cbffd8-d56c-4abe-1e05-0239ced64e3b.png)
対象シートの設定
「シートをシート名で指定」アクションの結果を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/5618aa3c-6c20-c0a3-f7f7-89e2e8fdb1f6.png)
コピー対象のセルの設定
データとして取り扱う範囲を設定します。1行目がヘッダーのため、「A2:G11」と指定しました。
その後、「1行目をヘッダーとみなす」をチェックすると、ヘッダー名が一覧で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/d5caef6d-38d7-a857-568a-e2d60df9e9a7.png)
これで、データの読み込みは完了となりますが、最終行が何行か分からなかったり、実行する都度変わるようなデータの場合、コピー対象のセルとして、今の指定の仕方ではよろしくありません。
そんな時に使えるのが、オプション内にある、「縦方向の取得条件」です。
「データの連続範囲を選択」を指定すると、空行が見つかるまでの範囲を取得してくれます。
その際、「コピー対象のセルの設定」は、「A2:G2」のように最初の1行だけ指定しておけば大丈夫です。
（横方向の同じように設定できますが今回は割愛しています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/3f8fc755-843f-4232-61bb-5912b3f42f75.png)

この状態で実行すると、正しくデータが取得できることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/66a67912-f905-d40a-2e34-3edbe57ed17e.png)

# ブラウザを介した画面操作
ブラウザを操作する部分を作ります。

## サイトを開く
まずは、RPAチャレンジサイトを開きます。
使うアクションは、「URLにアクセス」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/0c224c09-4238-08d5-46e9-c353c7c9a51c.png)
URLにアクセスするURLを設定し、表示名（この後ブラウザを指定するために使う）を設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/a23033ed-b406-24eb-16af-f4bcefb1e8af.png)

## 開始ボタンのクリック
サイトが開いたら、「開始」ボタンをクリックします。
使うアクションは、「クリック」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/66cef2d3-b581-b3f1-d8a7-5e5ff3ce0a8c.png)
ブラウザには、先ほど「URLにアクセス」で設定した表示名が選択肢として出てくるので、それを設定します。
要素は、「指定」をクリックすると、Selector Helperという画面から項目を選択するウィンドウが起動するので、その中で、「開始」ボタンを選択します。選択した結果は、要素に格納されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/cae96640-99a2-2e87-fa7d-c63c2b8590b3.png)

## 各項目に値を設定（その１）
次に、各項目に値を設定します。
使うアクションは、「画面に情報を入力」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/e73a5ea3-fdaf-21a6-716c-f54e66646553.png)
先ほどと同様に、ブラウザを選択し、要素をSelector Helperから選択します。
入力内容には、Excelから取得した苗字を設定するのですが、まずは、ダミーで「苗字」という文字列を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/845d9ee5-5fb5-c092-8016-367b41ddcd75.png)
これを値を設定する項目すべてに対して行います。

## 登録ボタンのクリック
登録ボタンのクリック処理は、開始ボタンのクリックの手順と同様なので割愛します。

## 画面操作の設定を簡単に行う方法
開始ボタン、各項目への値の設定、登録ボタンと個別に設定する方法を書きましたが、実は一気に設定する方法があります。
URLにアクセス内にある「要素選択を開始」をクリックすると、Selector Helperが起動するので、そこで連続して項目を選択することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/d138aae4-6fa0-0142-56c6-ffe2081e91d1.png)
各項目を設定した状態は、こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/b968b7b7-aabd-fff9-cab9-6ab7ea20d164.png)

## 実行そして・・・
ブラウザ操作部分を実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/f2d57565-3b22-daf3-ef43-3ee915d7c962.png)
あれれ？正しい場所に設定されません。
実はここが罠でして、各項目のIDと場所が実行するたびに変わるのです。

苗字の設定をした要素部分を詳しく見ていくと
最初の要素：`#xSeK5`　
これはIDの値ですが、実行するたびに変わるため、一致する要素は存在しません。
次の要素：`:nth-child(3) > rpa1-field > div > input`　
ここで3番目の要素(上から2番目の左側の要素)が指定されています。
結局、この要素に一致する、上から2番目の左側の要素に「苗字」が設定されます（実際は住所の項目なのに）。

## 各項目の正しい要素を設定する
ブラウザには要素を確認する機能があります。ChromeやEdgeの場合は、F12を押すことで表示できます。
下図はChromeで、「苗字」の部分の要素を確認したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/851aede9-c0f6-5133-8c3f-b6a1746266be.png)
要素：
`
<input _ngcontent-c2="" ng-reflect-name="labelLastName" id="IyFDg" name="IyFDg" class="ng-untouched ng-pristine ng-invalid">`

この中で、固定値っぽい項目を探します（何度か画面をリロードして見てみるとよいです）。
すると、`ng-reflect-name="labelLastName"`が固定値っぽいことが分かります。
そこで、最初の要素に、下記のように設定します。
最初の要素：`input[ng-reflect-name="labelLastName"]`

他の項目も同様に正しい要素に変更していきます。

実行してみると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/7bb8bed0-e767-ee0d-8a38-c312429174e2.png)
キレイに設定されました。

# 繰り返しの中で処理する
Excelから読み込んだ行ごとに繰り返しを行います。
使用するアクションは、「各要素について繰り返す」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/2652396c-fd35-d32a-33f6-b31035f0657b.png)
受け取るリストには、セルをコピーを指定することで、読み込んだ各行での繰り返しを行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/d0d713b8-159a-b2ac-2e82-b649b2c458b1.png)
ここで作成した繰り返しの中に、さきほど作成した、各項目への設定と「登録」ボタンクリックを移動します。
最後に、各項目への値の設定処理の入力内容を変更します。
入力内容に「各要素について繰り返す」を指定すると、「値を選択」が出現します。
値を選択では、列ヘッダー情報が選択肢に出てくるので、対象の列名を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/970dfacd-cf22-6761-98a3-bd984d840b10.png)
これを各項目に対して行います。

# ローカルで実行
ちゃんと動いていることを確認したいので、
ローカル実行、ブラウザの画面を表示、終了時にブラウザを閉じないをONにします。
高速モードで実行は、デバッグ時はOFFの方がいいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/397db712-ff17-3134-a2ee-3ca5d79112bc.png)
実行した結果、ちゃんと正解率100%で実行できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/a90ea621-ec82-b30a-9834-58f126e69648.png)

# クラウドで実行
Coopelはクラウド型のRPAツールです。ブラウザ操作も含めてクラウド上で実行することができます。
ローカル実行をOFFにすることで、クラウドで実行することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/2f7d42fa-6902-271b-03eb-9c9bd3619fd6.png)
このとき、処理結果が確認できないため、処理の最後に「画面をキャプチャー」というアクションを追加して、処理結果のキャプチャーを取得するようにしました。
実行結果を確認すると、ちゃんと正常終了して、キャプチャーが取られています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/d86b7416-da53-0166-3cc6-6635004b7878.png)
結果を拡大すると、こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218396/600fd23d-455d-4df6-b1c3-90fed53cc358.png)
クラウドで実行できると、他の作業をしながら、処理が終わるのを待つことができるので、嬉しいですね。

# まとめ
クラウド型RPAツールであるCoopelを用いて、RPAチャレンジを実施してみました。
* Excelからのデータ読込
* ブラウザ操作
* 繰り返し

といった基本的なアクションを組み合わせるだけの、いわゆるノーコードで開発することができました。
正しい要素を設定するために、若干複雑なことをしましたが、やり方さえ覚えれば大丈夫です。
ちなみに、Selector Helperで設定するだけで動くサイトの方が多いと思いますでご心配なく。