【Ruby】Seleniumでalertが表示されるまで待ちたい
こんにちは、しきゆらです。
なんかあれこれしているうちに今年もほぼ半分ほど過ぎていました。
早いものです。
今回は、SeleniumでAlertが表示されるまでの間待機したいことがあったので、調べて解決したのでメモしておきます。
Seleniumとは
Seleniumはブラウザー自動化を可能にし、それを支えるツール群とライブラリー群プロジェクトです。
https://www.selenium.dev/documentation/ja/
Seleniumとは、簡単に言えばブラウザの操作をスクリプトから操作し、Webアプリケーションの動作確認などに使用されるツールになっています。
また、ブラウザを自動操作できるので、手作業を自動化するためにもつかわれたりします。
Rubyさん以外にも、JavaやPythonなどたいていの言語から利用できるようになっています。
お好きな言語で書けるのがありがたい。
今回は、Seleniumを使って手作業で行っていた操作を自動化する用途でSeleniumを利用していました。
Web上でユーザ情報を管理するようなサービスを利用しており、この情報をGoogleスプレッドシートにあるものをもとに追加・修正を行うというような感じです。
とてもではないが、手作業では面倒すぎて死んでしまう・・・。
ということで、Seleniumさんの力を借りて自動化しようとしていました。
今回の問題
処理をSeleniumさんで自動化するのは良いとして、問題は対象とするサービスのほう。
情報を変更するたびに、ブラウザ側で確認の意味なのか毎回alertが出るんです。
「保存しました」的な文言を出すだけなのですが、これが厄介。
Seleniumさんは、Alertが出ているときに要素へアクセスしようとするとエラーで落ちてしまいます。
つまり、処理の中でAlertが出るまで待ち、出たらOKを押してAlertを閉じなければいけないわけです。
と、いうことでSeleniumさんでAlertが出るまで待つ方法を探してみました。
調べてみると、JavaやPythonでは専用のメソッドが定義されているようですが、Rubyにはないようでした。
例:alert_is_present-Python | https://www.seleniumqref.com/api/python/conditions/Python_alert_is_present.html
解決方法
RubyでもAlertが出るまで待つ方法必要だろう・・・、と思いながら調べてみると、似たようなことで困っている人がいました。
selenium – How to use wait for alert in ruby webdriver – Stack Overflow | https://stackoverflow.com/questions/10905560/how-to-use-wait-for-alert-in-ruby-webdriver/10905711
メソッドないけど出るまでループすればええやん、という感じでコードのサンプルを示してくれていました。
[ruby]
loop do
alert = driver.switch_to.alert rescue "alert not displayed."
next if alert == "alert not displayed."
alert.accept
break
end
[/ruby]
上記サイトのものから少し手直ししています。
大まかな流れとしては以下の通り。
「driver.switch_to.alert」は表示されているAlertにフォーカスを当てる部分なのですが、Alertが表示されていない段階でアクセスするとエラーが起きます。
そこで、エラーが起きた場合はrescueで適当な文字列を返すようにしておきます。
この文字列が変数「alert」に入っている場合は、まだAlertが表示されていないのでもう一度ループに戻す。
そうでない場合は切り替えができたので、「accept」を実行してループを終了する。
いい感じにメソッド一発で解決すればうれしいなぁと思っていたのですが、ないなら作るしかないですよね。
Rubyさんにもメソッドを定義してほしいなぁと思った今日この頃でした。
まとめ
今回は、Seleniumさんでブラウザを自動化する中で、画面上に表示されるAlertが表示されるまで待つ方法を調べ、実装してみました。
ifやunlessは後置で使ったことがありましたが、rescueも同じように使えるのは知りませんでした。
調べてみると、少しずつ世界が広がる感じがして楽しいですよね。
ということで、今回はここまで。
おしまい