にわとりプログラマーの備忘録

覚えたことをすぐ忘れてしまう、自分のための備忘録ブログです。

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]seleniumchromeを使用する
https://blog.hello-world.jp.net/ruby/1651/