RubyでWebブラウザを自動操作する方法!Watirの使い方を徹底解説
Rubyのコードだけで、Webブラウザを思い通りに操作できたら便利だと思いませんか?
実は、RubyGemsの「Watir」を使えばそれが可能です。
しかも、モダンブラウザが持つ機能をフルに活用できます:
- 表示中のページのスクリーンショットを撮影できる
- 開発者ツールを手動で開いてコードを打ち込むことなく、任意のページ上でJavaScriptを実行できる
- リンクを探してクリックしたり、テキスト入力欄に文字を入力したりできる
これらはすべて、WatirとSeleniumプロジェクトによって実現されています。
それでは、実際のコード例を見ていきましょう!
ブラウザを起動する
まず、次のようにBrowserオブジェクトを作成します。
require 'watir' browser = Watir::Browser.new
これで空のChromeウィンドウ(Chromeがインストールされている場合)が開き、以降はこのウィンドウをコードから制御できるようになります。
たとえば、次のようにURLへ移動できます:
browser.goto("rubyguides.com")
ChromeがこのURLへ移動し、自分でアドレスバーに入力したときと同じようにページが読み込まれます。
ここから先は、普段マウスとキーボードで行うような操作なら何でもコードから実行できます。
たとえば、リンクを探してクリックすることも可能です。
例:
browser.link(text: "All Posts").click
Watirで要素を検索する方法
要素は、その属性をもとに検索できます。主な属性は以下のとおりです。
- text(テキスト)
- class(クラス)
- id(ID)
これらの要素にはHTMLタグ名に対応したメソッドが用意されています。H1タグを探すならh1、段落ならp、画像ならimgまたはimagesを使用します。
例:
browser.h1(text: "Ruby Post Index")
また、メソッド名を複数形にすると、該当する要素のリストを取得できます。
例:
browser.links browser.images browser.h2s
この場合、Watir::AnchorCollectionのようなコレクションオブジェクトが返され、each、map、injectといったRubyらしいメソッドが使えます。
例:
browser.links.map(&:href)
タイムアウトと存在しない要素への対処法
要素が見つからないことがあります。原因としては、要素がまだページに読み込まれていないか、ページ構成が変更された可能性などが考えられます。
Watirが要素を見つけられなかった場合、どうなるのでしょうか?
答えは「タイムアウト」です。
デフォルトでは30秒に設定されていますが、次のように変更できます:
Watir.default_timeout = 10
タイムアウト時間が経過すると、Watir::Exception::UnknownObjectExceptionという例外が発生します。
しかし、例外に頼らずに対処する方法もあります!
クリックなどの操作を行う前に、要素が存在するかどうかを事前にチェックできるのです。
書き方はこちら:
link = browser.link(text: 'Guides') if link.present? link.click end
スクリーンショットを撮る方法
ブラウザを開いてページを読み込んだら、その画面をスクリーンショットとして保存できます。
書き方はこうです:
browser.screenshot.save("/tmp/screen.png")
これにより、現在のビューポート(表示領域)の画像が保存されます。
JavaScriptを実行する
ブラウザ上でJavaScriptを実行すれば、ページの現在の状態を操作したり、そのページで定義されているJavaScript関数を呼び出したりできます。
書き方はこちら:
browser.execute_script "alert('bacon')"
# nil
結果はどうなるでしょうか?
「bacon」という文字が表示されたアラートウィンドウが出ます 🙂
コードを実行して結果を受け取ることもできます:
browser.execute_script "return 1 + 1" # 2
入力フィールドに入力する方法
テキスト入力欄への入力は、次の2ステップで行います。
- 対象の要素を見つける
- キー入力を送信する
具体例はこちら:
browser.input(id: "search").send_keys("orange juice")
あとは送信ボタンを見つけてクリックすれば完了です。
覚えておくと便利なWatirのメソッド&Tips
Watirには、日々の作業に役立つ便利なメソッドが多数用意されています。
たとえば、現在のURLを取得するには:
browser.url
開いているタブの一覧を取得するには:
browser.windows
現在のウィンドウを最大化するには:
browser.window.maximize
現在のページのテキストやHTMLを取得するには:
browser.text browser.html
さらに、部分一致で要素を探したい場合は、正規表現を使うのがおすすめです。
たとえばこんな感じです:
browser.p(text: /ruby/)
まとめ
本記事では、Rubyのgem「Watir」について学びました。Watirを使えばWebブラウザをリモート操作でき、タスクの自動化やページからの情報抽出が簡単に行えます。
この記事が役に立ったと思ったら、ぜひシェアして更多人に届けてください!
最後までお読みいただきありがとうございました。
-
Raspberry PiとOctoPrintで3Dプリンターを快適に制御する方法
3Dプリンティングは、初心者にとってハードルが高い趣味に思えるかもしれません。しかし、仕組みさえ理解してしまえば、非常に楽しくやりがいのある趣味へと変わります。入門者の中には、Windows 10で手軽に使えるプラグアンドプレイ式の3Dプリンターを購入したいと考える方も多いでしょう。例えば、Monoprice Select Mini Pro(約250ドル)や、3Dプリントに加えてレーザー彫刻・CNCフライス盤機能も備えたSnapmaker 3in1(約800ドル)などが挙げられます。どちらもエントリーモデルとして優れた選択肢ですが、造形サイズが小さいため、大きなパーツを印刷したくなったとき、す
-
GIFの自動再生を無効にする方法!主要ブラウザ別の設定手順を徹底解説
アニメーションGIFは、静止画に動きを与える最も手軽な方法です。JPEGやPNGといった他の画像フォーマットと比べて、メッセージや情報をわかりやすく伝えられる点が大きな魅力で、面白く、ユーモラスで、時に説明不要なほど直感的、そして時には意味不明――そんな多面的な表現力を持っています。しかし一方で、GIFは作業の妨げになったり、非常に煩わしく感じたりすることもあります。許可なく勝手にアニメーションが再生されるのは快適とは言えませんし、大量の帯域幅を消費してページの読み込みが遅くなる原因にもなります。幸い、これらの自動再生GIFはブラウザ側で停止できます。GIFがお好みでない方は、無効化すればペー