Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

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のようなコレクションオブジェクトが返され、eachmapinjectといった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ステップで行います。

  1. 対象の要素を見つける
  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ブラウザをリモート操作でき、タスクの自動化やページからの情報抽出が簡単に行えます。

この記事が役に立ったと思ったら、ぜひシェアして更多人に届けてください!

最後までお読みいただきありがとうございました。

  1. Raspberry PiとOctoPrintで3Dプリンターを快適に制御する方法

    3Dプリンティングは、初心者にとってハードルが高い趣味に思えるかもしれません。しかし、仕組みさえ理解してしまえば、非常に楽しくやりがいのある趣味へと変わります。入門者の中には、Windows 10で手軽に使えるプラグアンドプレイ式の3Dプリンターを購入したいと考える方も多いでしょう。例えば、Monoprice Select Mini Pro(約250ドル)や、3Dプリントに加えてレーザー彫刻・CNCフライス盤機能も備えたSnapmaker 3in1(約800ドル)などが挙げられます。どちらもエントリーモデルとして優れた選択肢ですが、造形サイズが小さいため、大きなパーツを印刷したくなったとき、す

  2. GIFの自動再生を無効にする方法!主要ブラウザ別の設定手順を徹底解説

    アニメーションGIFは、静止画に動きを与える最も手軽な方法です。JPEGやPNGといった他の画像フォーマットと比べて、メッセージや情報をわかりやすく伝えられる点が大きな魅力で、面白く、ユーモラスで、時に説明不要なほど直感的、そして時には意味不明――そんな多面的な表現力を持っています。しかし一方で、GIFは作業の妨げになったり、非常に煩わしく感じたりすることもあります。許可なく勝手にアニメーションが再生されるのは快適とは言えませんし、大量の帯域幅を消費してページの読み込みが遅くなる原因にもなります。幸い、これらの自動再生GIFはブラウザ側で停止できます。GIFがお好みでない方は、無効化すればペー