WinActorで困った話　その２（Chrome編）

#今回の内容
こんにちは。
先日、Chromeを使用したRPAシナリオを作ったのですが、IEの場合と異なる部分が多々あり、思いの外苦戦しました…
そこで今回はメモ代わりとしてIEとChrome（Edge）の出来ること出来ないことの比較と、Chromeでシナリオを作る際の注意点を書いていきます。
#IEとChrome（Edge）の違い
WinActorでは、IEと最近のブラウザで使用可能なライブラリが違います。（IE用とブラウザ用で分かれてます。）
そのため、IEで出来てもChromeで出来ない！またはその逆というのが多々あります。
ちなみに最近のブラウザと書きましたが、**何故かFireFoxは未対応です**。（なんで仲間外れなんですかね…？）

以後、Chromeなどで使うライブラリは「ブラウザ用ライブラリ」と記載します。
##違う部分の比較
違う部分を一覧にまとめました。詳細は後述します。

|  | IE用ライブラリ | ブラウザ用ライブラリ |
|:--|:-:|:-:|
|共通|ウインドウ指定（イメージ保存）|XPathによる指定|
|値の取得|タグ、クラス名指定による取得|XPathによる取得|
|操作|クリックは可能。ただしリストボックスなどの選択は不可|クリック、リストボックスの選択など一通り可能|
|テーブル|表情報の一括取得が可能（行数なども取得可）|表内の値のみ取得可能（行数も取得不可）|
|フレーム|各ライブラリ毎に指定|フレーム選択ライブラリが存在|

##ブラウザ用ライブラリの特徴
###ブラウザ名の指定
ブラウザ用ライブラリを使用するには、開いたブラウザに予め**ブラウザ名**を設定しておく必要があります。
JavaScriptでウインドウ開くときに設定する名前と同じものです。
ライブラリを使用する時に、必ずブラウザ名が求められるので必須になります。
![ブラウザ名.jpg](https://qiita-image-store.s3.amazonaws.com/0/311963/fa08049b-b464-6bb6-db1c-bef3cb058f0e.jpeg)
ブラウザ用ライブラリを使う場合、ブラウザ名は必須なので変数に登録しておくのがオススメです。
![変数一覧.jpg](https://qiita-image-store.s3.amazonaws.com/0/311963/535c701a-aa24-ec3d-e84f-dfa13d5bfb03.jpeg)

###XPath
ブラウザ用ライブラリは、全て**XPath**による指定になります。
Chrome、Edgeではデベロッパーモードを起動することで取得できます。タグとかも意識する必要が無いので、シナリオ作成はこちらの方が楽です。
![XPath.jpg](https://qiita-image-store.s3.amazonaws.com/0/311963/7c703f67-650e-016d-8174-73209373164f.jpeg)
ただしIE用ライブラリで使用出来た、ボタンのValue値による特定などが出来なくなっているので、そこがデメリットになる場合もあります。

`XPathサンプル（GMailの受信トレイリンクのXPath）：//*[@id=":iq"]/div/div[2]/span/a`

[XPathについてはこちら（WikiPedia）](https://ja.wikipedia.org/wiki/XML_Path_Language)
#ブラウザ用ライブラリの注意点
IE用ライブラリとブラウザ用ライブラリ、どちらも使った感想としては使いやすさと精度の面でブラウザ用ライブラリの方が使いやすかったです。
特にIE用ライブラリはイメージを消してしまうと動作不能になります。そういう管理が無いだけ大分楽でした。
ただブラウザ用ライブラリも注意しないと、思わぬエラーが起きます。
##動的ページでのXPath指定
XPathの指定は非常に楽なんですが、動的ページの場合は注意が必要です。
XPathというのがタグの階層を簡略化して表示しているだけのもののため、画面制御により増減した項目がたまたまライブラリに設定したXPathと同じだった場合、意図しない項目に対しライブラリの処理が行われてしまいます。

図で説明するとこんな感じです。
![XPathすり替わり.jpg](https://qiita-image-store.s3.amazonaws.com/0/311963/74a76c94-f949-db4b-5907-2f25811f69c4.jpeg)
上の図を元に例を説明すると、

1. 画面パターンAの時に［ボタン２］に対するアクションを設定
2. シナリオ実行中、画面制御で画面パターンBになる
3. XPathがすり替わり［ボタン１］に対してアクションを実行（実行したいのは［ボタン２］のアクションなのに…！）

初めてこの状況に直面した時は、こんな顔**Σ(ﾟ∀。；)**になりました。普段XPathのすり替わりなんて意識しませんからね…
ちなみにXPathのすり替わりは次のような場合に起きます。

- HTMLソースがコメントアウトされている場合
- Webアプリケーションの制御でHTMLソースに記述が無い場合
- 指定タグの数が1つから複数、またはその逆になった場合

最後が分かり辛いのですが、これはXPathの仕様で**同一タグの数により配列部分の付与**が行われるためです。上の図で言えばXPathの「/html/body/input[1]」がボタン１つになると「/html/body/input」になります。

逆に発生しないケースは、

- visibilityのhiddenによる非表示
- displayのnoneによる非表示

要はHTMLソースに書いてさえいれば、XPathのすり替わりは発生しません。
繰り返しで動的ページを処理する場合は、意外な落とし穴になるので注意です！
この場合は直前に判定処理を入れるなりして対応しましょう。
##テーブルに対してのアクション
テーブルに対して値の取得やアクションを行う場合は、少々工夫が必要です。特に行数分繰り返しを行う場合、結構工夫する必要があります。
値を取るだけなら、テーブルをコピーしてExcelに貼り付け、その後に値を取得という方法もあります。

今回は独自に表内のアクションを実施するシナリオを作成してみました。
下の図はテーブル内のアクションを行うシナリオのサンプルで、行数可変の状況も想定しています。
![テーブル.jpg](https://qiita-image-store.s3.amazonaws.com/0/311963/f35d8e90-5ae5-8ce9-9770-0af3cb6b5d73.jpeg)
ポイントは以下の部分。

- テーブル内のinputタグやaタグは、既にtrタグ、tdタグに配列が設定されているため可変にならない
- 可変部分のtrタグ、tdタグの数値部分に行数カウントを当て込むことで繰り返しを可能にした
- 行が存在しなくなった場合「表内ボタンクリック」の部分でエラーが発生するので、例外をキャッチし繰り返しを終了

少々強引な方法だとは思いますが、この方法ならばテーブル内のアクションが可能になります。お試しあれ！
##フレームの指定
ブラウザ用ライブラリでフレーム指定を行うと面倒な部分…というか意識しなければいけない部分が多いです。
特に気を付けないといけない部分は以下の通り。

1. フレーム内の処理を行う前に必ず「フレーム選択」ライブラリを入れる必要がある
2. 「フレーム選択」ライブラリでフレームを選択しないと、XPathを指定しても動作しない
3. フレームは１段階ずつしか移動出来ない（親⇒子⇒孫の場合、親から孫には移動出来ない）
4. ３で移動は１段階ずつと書いた通り、子フレームを跨って移動することも出来ない（子⇒子というフレーム移動は出来ない）
5. **フレームを移動した状態で、別画面に遷移するとフレームの選択状態が引き継がれる**

この中で最も気を付けないといけないのは５番目の内容です。
図でも分かり辛いですが、とりあえず図で説明しますと…
![フレームの穴.jpg](https://qiita-image-store.s3.amazonaws.com/0/311963/9e260323-0ded-5d5c-44d9-8c4b1edef507.jpeg)
**この場合、フレームに移動した後にブラウザ用ライブラリを実行するようにしないとXPath指定が不正となりエラーが発生します。**
※2019/04/22補足
この現象は、ページ全体ではなくフレーム内のページ遷移時のみ発生するようです

フレーム移動状態が引き継がれるとは思わなかったので、この現象に直面した時は、もうこんな感じ**？(ﾟД。)？**です。

フレームが使用されている画面の場合、フレーム移動の管理をしっかりしないと想定通りの動きをしないので注意しましょう！

#まとめ
ブラウザ用ライブラリは各種指定が楽になのですが、落とし穴も結構あります。
RPAで処理をするページは大体動的ページだと思うので、シナリオ作成をする前に、十分に画面検証を行うようにしましょう。（じゃないと、僕のような顔になりますよ！）

以前、[RPA開発をこれから始めるために](https://qiita.com/toshi_orz/items/3ad628affdeef0902923)で書いた、「HTML知識があると便利」というのは今回のような内容に直面した場合、原因や現在の状況が把握しやすいためです。
基礎知識だけでもいいので覚えておくと、今回のような事態に直面しても早い段階でミスに気付けると思います。

今回はメモとしても書いたので長くなりました。
次回は未定ですが、今度は短めにいければいいな…
それでは！