Ruby
Selenium
GoogleAppsScript

SeleniumとGoogle Apps Scriptをちょっと連携させてみる

はじめに

この記事はSelenium/Appium Advent Calendar 2017の21日目の記事です。

今回のテーマは「Selenium」です。
ブラウザの操作を自動的に行なう→ユーザテストに便利、なので以前から気になっていた技術のひとつでした。
しかしなかなか活かせる機会がなく、触ったことはありませんでした。
ところが最近会社の同期と会話をしているときに、これはSeleniumを活かせるのでは?と思える事象に遭遇しました。
彼はマーケターなのですが、メディアを作る際にフォームを入力するそうで、ひとつひとつ手打ちでしかも量が多いらしくかなり面倒とのこと。
これはSeleniumを使って自動でフォームを作ることができれば、なかなかのハックだよね、と思いやってみました。

作ったもの

selenium-exec-gas.gif

Seleniumをどんなものかを知るにあたって動いているものを見たほうが早いので、GIF画像を載せます。
Seleniumを使って、
1. ブラウザの起動
2. メールアドレスの入力
3. パスワードの入力
4. Google Apps Script(以降GAS)の実行
5. 背景色をつける
を自動的に実行しています。

僕はSeleniumを初めて見たときに、感動しました。
「ブラウザでの入力が自動で出来るの!?」
ブラウザの動きはユーザがやるものだという凝り固まった概念があったので、Seleniumないしプログラミングって本当にすごいなと、久しぶりに鳥肌が立ちました。
今更Seleniumかよ、って思う人もいるかと思いますが、プログラミングを初めた頃の感動に似たものがあり、
こういった感動を大事にしてプログラミングを楽しんでいきたいなと再確認することが出来ました。
ちょっとエモくなってしまいましたが、そこはご愛嬌でお願いいたします…。

Seleniumって?

Seleniumについて簡単に説明しておくと、
Seleniumとは、ブラウザを使ってWebアプリケーションを自動でテストするオープンソースのソフトウェアです。

Webアプリケーションを開発する際は、単体テストや結合テストといったソフトウェアの品質を担保するためにテストが欠かせません。

test-v.png

※引用元:アジャイルかウォーターフォールか、どちらが品質を「保証」できるのか -トヨタの自工程完結に学ぶソフトウェア開発-|@Koki_jpさんのブログ
https://qiita.com/Koki_jp/items/23f8ca5ee99b5c076976

上の図にはありませんが、テストの一種に「ユーザテスト」があります。
ユーザテストは、実際にWebアプリケーションを使うユーザが製品に不満を覚えないか、使用する上で不都合がないかをチェックするためのテストです。
ユーザテストの詳細は調べればたくさん出てくるので省きますが、
Webアプリケーションの品質を担保するためにユーザテストは欠かせないことの1つといっていいでしょう。

ユーザテストは基本的にはブラウザを用いて行ないますが、いちいちブラウザでチェックするのは大変な面も多いです。
そこで考えられたのが、ブラウザでの動きを自動的に行えないかという観点でした。
ブラウザでの動きを自動的に行うツールはいくつかあり、Seleniumはそのうちのひとつです。

メルカリさんもSeleniumを使ってテストを行っている面もあるようです。
http://tech.mercari.com/entry/2017/10/31/122018

プログラマであれば、「自動」というワードにぐっとくるひとは多いでしょうし、煩雑な作業をツールで便利にしてくれるのはわくわくしますね。
是非Seleniumを使ってテストや作業を楽しいものにしてみましょう!

実行環境、コードなど

以下のサイトを参考に、Seleniumが動くための環境を用意しました。
コードはRubyで書いてます。

参考サイト:
https://qiita.com/edo_m18/items/ba7d8a95818e9c0552d9
https://qiita.com/tomerun/items/9cb81d7a98150ff22f53

以下コードです。

test.rb
require "selenium-webdriver"

# Firefox用のドライバを使う
driver = Selenium::WebDriver.for :firefox

# スプレッドシートにアクセス
driver.navigate.to "https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
puts "指定のURL入力完了"
sleep 3

# ログインメールアドレスの入力し、次へをクリック
input_mail_address = driver.find_element(:id, 'identifierId')
input_mail_address.send_keys "mailaddress@xxx.com"
driver.find_element(:id, 'identifierNext').click
puts "メールアドレス入力完了"

sleep 3

# パスワードの入力
input_password = driver.find_element(:id, 'password')
input_password.send_keys "password"
driver.find_element(:id, 'passwordNext').click
puts "パスワード入力完了"

sleep 10

# 起爆用のボタンをクリックして実行
driver.find_element(:class_name, "waffle-borderless-embedded-object-container").click
puts "GAS実行完了"

表示されたページのタイトルをコンソールに出力
puts driver.title

やってることは単純で、
1. 指定したURLにアクセスする
2. メールアドレスを入力
3. パスワードを入力
4. スプレッドシートにアクセス後、ボタンをクリックする
5. 設定したスクリプトの実行(セルの背景を変える)
です。

途中のsleepというメソッドはRubyのメソッドで、次のアクションまで指定された秒数待機しています。

ちなみに、Seleniumのチートシートを使うと便利です。
やりたいことがほぼほぼ載ってます。
http://morizyun.github.io/web/selenium-cheat-sheet.html#JSのダイアログの操作

さて、GASの実行までできたので、取得したセルを連想配列に入れて…
と想定していましたがハマりました。
悲しいですが、時間切れのため次回再チャレンジします…

まとめ

今回、Seleniumを使ってGASを起動するところまでは行きましたが、そこからハマってしまい、
タイムアップとなってしまいました…

また、GASではなく、GoogleAPIを使ったらいけると先輩に教わったのでやってみたのですが、OAuth系でつまづき別なところの問題でハマってしまうという罠が…。
次こそGASを使ってスプレッドシート内の任意の文字列を取得し、それをもとに別サイトに飛んで入力作業を自動的にやってみたいと思います。

それにしてもやはりプログラミングの力を借りて面倒な作業を便利にしたり、人を助けられるのはいいですね。
プログラミングという行為自体も楽しいですが、それが他人の役に立てばやりがいはより一層大きいと思います。
自分の技術で人を助けられたら本望だなと、今回のSeleniumを通じて確認できました。

みなさんもSeleniumを使って自動化の素晴らしさを実感してみてくださいね!