Scala + Selenium を使ってブラウザの操作を自動化してみる
Seleniumとは?
Seleniumとはブラウザをプログラムから操作することでUIテストを自動化してくれる
テストツールです。
対応言語
Seleniumは多くの言語に対応しており Java, C#, python, ruby, php, perl, javascript(node.js) にて処理を記述できます。 Javaで記述できるということで、Scalaを使ってブラウザの操作を自動化してみたいと思います。
準備
プロジェクトの作成
activatorを利用してテンプレートからプロジェクトを作成します。
$ activator new selenium_test Fetching the latest list of templates... Browse the list of templates: http://typesafe.com/activator/templates Choose from these featured templates or enter a template name: 1) minimal-akka-java-seed 2) minimal-akka-scala-seed 3) minimal-java 4) minimal-scala 5) play-java 6) play-scala (hit tab to see a list of all templates) > 4 OK, application "selenium_test" is being created using the "minimal-scala" template.
build.sbtの記述
build.sbtにselenium-java
を追記します。
libraryDependencies ++= Seq( "org.scalatest" %% "scalatest" % "2.2.4" % "test", "org.seleniumhq.selenium" % "selenium-java" % "2.53.0" )
ChromeDriverをインストール
SeleniumはデフォルトではFirefoxを起動するようになっています。
Chromeを操作したい場合は、個別でChromeDriverをインストールする必要があります。
最初にChromeDriverのダウンロードページからzipファイルをダウンロードします。
その後、ファイルを解凍しシンボリックリンクを作成しておきます。
$ curl -O http://chromedriver.storage.googleapis.com/2.22/chromedriver_mac32.zip $ unzip chromedriver_mac32.zip $ rm -r chromedriver_mac32.zip $ mkdir ~/.selenium $ mv chromedriver ~/.selenium/ $ ln -s ~/.selenium/chromedriver /usr/local/bin/chromedriver
コードの記述
今回は下記の一連の流れを自動化するするための、コードを記述します。 1. Chromeを起動してgoogleにアクセス 2. 「selenium」について検索 3. 検索結果の画面を(無駄に)上下にスクロール 4. 検索結果のQuitaの記事を表示 5. 表示した記事の中の参考動画のリンクを表示
package com.example import org.openqa.selenium.chrome.ChromeDriver object SeleniumTest { def main(args: Array[String]): Unit = { val driver = new ChromeDriver() // Googleのページにアクセス driver.get("http://google.co.jp") // 検索フォームの要素を取得 val element = driver.findElementByName("q") // 検索フォームに「selenium」と入力 element.sendKeys("selenium") // 検索ボタンの要素を取得して、クリック val btn = driver.findElementByName("btnG") btn.click() // DOMが構築されるまで少し待機 Thread.sleep(2000) // JavaScriptを実行して、画面を上下にスクロール {List.fill(5)(250):::List.fill(5)(-250)}.foreach(y => { driver.executeScript(s"window.scrollBy(0,${y});") Thread.sleep(500) }) val clickLink = (linkText: String) => { val link = driver.findElementByLinkText(linkText) link.click() } // 検索結果のリンクをクリック clickLink("WebのUIテスト自動化 - Seleniumを使ってみる - Qiita") // Quitaの記事内の動画へのリンクをクリック clickLink("参考動画") Thread.sleep(35000) driver.quit() } }
実行
最後に下記のコマンドを入力することで、Chromeが起動して一連の操作が自動的に実行されます。
$ sbt run
参考
Selenium WebDriver - Selenium Documentation
http://www.seleniumhq.org/docs/03_webdriver.jsp#how-does-webdriver-drive-the-browser-compared-to-selenium-rc
Scala + Selnium
http://tototoshi.hatenablog.com/entry/20120310/1331369601
[mac][ruby]seleniumでchromeを使用する
https://blog.hello-world.jp.net/ruby/1651/