【自動化】Katalon Recorderのご質問に答えます【RPA】

こんにちは。okometsubuです。

 

本ブログでたった2回しか扱っていない「Katalon Recorder」という記事があるのですが、なぜか微妙な人気がある謎コンテンツだったりします。

 

これは何かというと、Webブラウザの操作を自動化してくれるアドオンで簡単なプログラムも組むことが出来る簡易自動化ツールとなっています。以下過去記事。

 

 

okometsubulog.hatenablog.com

 

こっちはもう少し具体的に書いたやつ。サンプルシナリオとして参考にできるかもしれないし、出来ないかもしれない。

 

 

okometsubulog.hatenablog.com

 

 

アクセス数が多いってことは、つまり、世の中「自動化」が進んでいるということです。もしかしたら仕事でも使われており、今後自動化は避けられない課題となるとかならないとか、そういう想像が膨らんでしまいます。

 

あぁ、そうなったら仕事首になる可能性が増えちゃうなぁ。自動化の記事を書くことで自分で自分の首を絞めることになりそうです。嫌な世の中です。

 

いいや、逆に言えばハイテクが進むことが今後明確になってくるというわけで、だったらハイテク株買っとけばいいんですよ!って話になるから別にいいか!

 

 

さて、そんな「Katalon Recorder」なのですが、こんなご質問を頂きました。以下引用させて頂きます。

 

勉強になるブログありがとうございます。自動化をやってみて、okometsubu様のおかげでとても良く仕上がったのですが(while trueとendWhileで無限ループを作ってます)、完璧にするためにお知恵をお貸しいただけたらと思います。
ド素人なので、わからないことが多い(し言ってる意味が伝わり辛い)と思うのですが、お手すきの時にでもご教授いただければ幸いです。

・あるサイトが0時から3時まで休止のため画面が変わってしまうとします。
するとkatalonでは0時にテストを打った際にエラーがでて(違う画面=クリックする場所が無くなり)そのまま何も施行されなくなってしまいます。

そこで自分が考えたのは
①if・else関数を用いる。

サイトの中に定型文をみつけて
{ここがjavaで書くのでしょうか?if ${TEXT} != "ほにゃらら" とか、 len(driver.find_elements_by_text_name('ほにゃらら)) > 0 みたいなのをやってみましたが見当違いですか?}、
その時だけ普通に動かして、それがない場合はpauseで3*60*60*1000(3時間)だけ待たして元の画面に戻れるような流れを作る。

selenium IDEというのにはタイマー機能があるようなのでそちらに乗り換える。

ただこれも時計の時間でできるのか不明ですし、3時間まった後、再開の画面に復帰できるかという問題点があります

 

 

こちらの質問に気づくのが遅れてしまいました。もうすでに解決されている気もしなくもないですが、せっかくなので取り上げます。

 

さて、取り上げたはいいのですが、私はプログラマーではなく、趣味で何となく使ってるだけの趣味グラマーレベルなので回答は困難です!!

 

しかしながらそんな私に質問されてしまうほど切羽詰まっているのでしょう。頂いた条件を軽く見て見ます。

 

①についてですが、これは仰る通りif~else分にpause使えば行けそうな気がしますね。使い方はサンプルを読み込んで使った方が楽かもしれません。以下公式サイト。

Samples | Katalon Docs

https://docs.katalon.com/katalon-recorder/docs/samples.html#sample-project

 

ここのサンプルで大体やりたいことの一式がそろってる気がします。if文のサンプルは「Katalon Recorder Samples.html」をOpenで読み込めば使えるようになるので一度見ておくと幸せになれるかもしれません。

 

 

で、今回のご質問としてはエラー画面が表示されるという問題があります。

 

これの対処方法としましては、エラー画面がどういう作りなのかよく分からないので、参考程度の情報をお伝えします。

 

まずエラーページを判断するのに使う要素を探します。私のイメージですが、以下のどちらかが実現できればいいのかなと考えています。

 

  • エラーページ専用の「タイトル」の値を取得する
  • エラーページ専用の「本文」の値を取得する

 

この2つのどっちかを取れればif文で判定できるのではないかと考えました。その流れで記事を進めます。

 

まずはテストケースを作成して、上記の「本文」の中身を取得してみましょう。

 

とりあえず「Record」で録画を開始します。これはテストケースでいじってもいいように新規で始めることをオススメします。

 

で、エラー画面にきたら、何かしらエラーページにしかない文字をクリックしてみてください。そうすると自動で「//div[@id='box2-inner']/div[3]/div」とか変な文字が記録されたと思います。

 

ここで録画を停止して、手動でいじります。

 

storeTextの行を追加して、で適当に変数に入れて、その変数を「if文」で判定するのです。

 

 

サンプルとして私のサイトのトップページで見て見ましょうか。

 

例えば、私のページの右側に「検索」という文字があると思います。まずは私のトップページにきて、Recordを押して、この「検索」という文字をクリックしてみましょう。別になんだっていいですが、とりあえずこれをクリック。

 

f:id:okometsubu-blog:20200812174920p:plain

赤枠の中をクリック

 

すると、「//div[@id='box2-inner']/div[3]/div」というのが記録されたと思います。これをstoreTextにて変数に入れてしまうのです。以下の行を1行追加してください。

 

 

Command:storeText

Target://div[@id='box2-inner']/div[3]/div

Value:hensuu ※変数名。適当でいいです。

 

 

で、if文ではこう書きます。

Command:if

Target:"${hensuu}"=="検索"

Value:無記入

 

これで先程クリックした「//div[@id='box2-inner']/div[3]/div」という文字列の中身が「"検索"」なら次の処理へ進み、違うならその後のコードは実行されません。後は先ほどのサンプルコードのif~elseを参考に、else文を作ればいいです。

 

つまり、この「検索」の部分を、エラーページ特有の文字がある場所をクリックして、if文で判定してしまえばいいのです。

 

他には、「title」の要素を取るという方法もあります。

 

storeTextコマンドでValueを「title」としてValueに変数名を入れることで、そのエラーページのタイトルを取得することが出来ます。以下サンプル。

 

Command:storeText

Target:title

Value:tai ※変数名。適当でいいです。

※2020/08/14更新

Targetの中身が間違っていたので修正

 

 

これで変数${tai}にタイトルが格納されました。もしタイトルがエラーページ専用の文字列ならこれでも十分ですね。

 

 

超ザックリなサンプルを画像で表示。

 

f:id:okometsubu-blog:20200812175805p:plain

 

上記やってることは、

  • 私のトップページを開く
  • そのページのtitleをtaiという変数に格納
  • 先程の「検索」の文字をhensuuという変数に格納
  • if文で${hensuu}を判定。画像ではあえてミスするように"検索miss"と一致しないようにしてますのでelse側が実行されます。判定文字列を"検索miss"ではなく"検索"に修正すると真となりますのでifの後~elseまでのコマンドが実行されます。
  • で、ifが通れば検索の文字入力に${hensuu}の内容で検索が開始され、else文の場合は私のブログのタイトル${tai}で検索されます。

 

これを実行するとこんな感じになります。else文を通るので、titleである${tai}で検索された画面に遷移していることが分かります。titleは「日々の生活をがんばるブログ」なので、その文字列を検索欄で検索したって話です。if文を真にしたならば、「検索」という文字列で検索したことになったでしょう。

 

 

f:id:okometsubu-blog:20200812175947p:plain

 

後はそれぞれでpauseする関数入れたり、while文入れたりすればいいかなぁと思った次第。pauseを使えばタイマー替わりになりますからね。私はなんか上手く行かなかったので、

 

Command:pause

Target:1000

Value:1000

 

と、両方に同じ数字を入れたらなんかうまく行きました。面倒なのでこうしてますが、確かTargetかValueのどっちかだけで良かった気がしましたがまま、いいでしょう。

これで、数値が大きすぎて動かないなら行を複数行入れれば良いんじゃないでしょうか。※未検証

 

※2021/6/25 追記

「pause」コマンドはif~elseで分岐しても必ず実行されてしまうようでした。以下@oh_rusty_nailさんの記事から引用させて頂きます。

Selenium IDE コマンドリファレンス (2019/09版 : Selenium IDE v3.12.0 [全96コマンドを徹底解説]) - Qiita

https://qiita.com/oh_rusty_nail/items/77782973b4152992017b

pause

明示的な待機を挟みます。
ただ、 SeleniumIDEのコマンドには、暗黙的な待機が組み込まれているため、 どうしても解決しない場合にのみ使うのが良いです。

 

②については確かにタイマー機能がSelenium IDEにあるようですね。ならばそちらに乗り換えるのはアリだと思いますがSelenium IDEを私は使っていないのでよく分からないです。Google先生に「Selenium ide タイマー」で検索したら設定方法の記事が結構出てくるのでそちらを参照された方が良いと思います。※既に実施されている気はしますが一応

 

 ということで、正直参考になってるかサッパリわかりませんが、こんな感じでしょうか。ただ、「Katalon Recorder」で無限ループ物作れるのかな。Recorderはかなり簡易的なツールなのでじっくりやるなら「Katalon Stadio」をインストールした方が良いかもしれません。※使ったことは無い

 

本当に知識が無いのでここいらで逃げ帰りつつ、今回はここまでと致します。

 

 

f:id:okometsubu-blog:20200812180603p:plain