まだブラウザ操作の自動化してないの??


概要

特に優先度高くないものだけど、いちいちブラウザ操作してるものって多々あるよね。
ビジネス職でもエンジニアでもブラウザって必ず操作するはずです。

Seleniumとは

Webブラウザを使ってWebアプリケーションをテストするツールです。

見たほうが早いと思うのでスクショ!

  1. Qiitaのログインページに遷移
  2. ログイン情報の入力
  3. いいねをつけたい記事に遷移
  4. いいねをする

具体的に何が自動化できるの?

  • 定期的に見ているデータの取得
    • 情報メディア
    • SNS
    • ECサイト
  • ブラウザを人間が叩いて行う簡単なフローのテスト

インストール

事前にChromedriverをダウンロードしとく
解凍したものを$home/binに配置

サンプルコード

require 'dotenv'
require 'selenium-webdriver'

# ENVの読み込み
Dotenv.load
QIITA_LOGIN_EMAIL = ENV['QIITA_LOGIN_USER_NAME']
QIITA_LOGIN_PW = ENV['QIITA_LOGIN_PW']

# QIITAのログインページのURL
LOGIN_URL = 'https://qiita.com/'

class QiitaCrawlUser
  attr_reader :driver, :target_url

  def initialize(target_url)
    @target_url = target_url
    @driver = Selenium::WebDriver.for :chrome # ここでブラウザ指定
    @driver.manage.timeouts.implicit_wait = 10 # 10.seconds
  end

  def like
    login
    puts "like start"
    driver.navigate.to target_url
    parent_classes = driver.find_elements(:class => "likable")[0].attribute('class')
    return if parent_classes.split(" ")[2] == 'liked'

    driver.execute_script "document.getElementsByClassName('likable')[0].children[1].click();"
    driver.quit
  end

  private
  def login
    puts "login start"
    driver.navigate.to LOGIN_URL #ログイン画面に繊維

     driver.find_element(:name, 'identity').send_keys(QIITA_LOGIN_EMAIL)
     driver.find_element(:name, 'password').send_keys(QIITA_LOGIN_PW)
     driver.find_element(:name, 'commit').click
   end
 end
 article_url = "https://qiita.com/tomerun/items/9cb81d7a98150ff22f53"
 QiitaCrawlUser.new(article_url).like

組み合わせると便利 Slack

僕はgemの 'slack-ruby-client'を使ってSlackへポストすることはよくやりますね。
自動化した時に監視や認知は必須なので。。。

Twitterで特定の単語とってくるとかAPIを用いてごにょごにょのときによく使う。

require 'slack-ruby-client'
Slack.configure do |config|
  config.token = ENV['SLACK_API_TOKEN']
end
slack_oauth = Slack::Web::Client.new
slack_oauth.chat_postMessage(channel: '#times_watch_twitter', text: '送りたいメッセージ', unfurl_links: true, as_user: true)

unfurl_links: trueにするとリンクが展開されるようになるので、リンクだけ送る用途はよく使います。

最後に

やるからには全部自動化したほうが良くて。
人間がやらなくていいことは自動化しましょ!