こんにちは。学生エンジニアのhashimotoです。

自分がクローリング会社のrooterに入った時は自分以外のエンジニア全員macユーザーだったのですが、最近は少しずつwindowsユーザーも増えてきました。クローリング会社はMacが多いというのは豆知識ですね。(Web系の開発会社はどこもそうなのでしょうが。)

そこで今回は、WSL(Windows Subsystem for Linux)環境でseleniumの動作を確認しながら開発するために、windows側のchromedriverを指定するということを紹介します。

Ubuntuでのselenium環境構築

自分の開発環境では、WSLのUbuntu環境とwindows環境両方にchromedriverを入れています。Ubuntuでの環境構築は過去記事 「chrome ヘッドレスの環境構築(Ubuntu編)」をご覧ください。

ここでUbuntuにもchromedriverを入れているのは、WSLでもヘッドレスなら問題なくseleniumが動くのと、サーバー環境でも同じコードで動くようにするためです。

しかし、ここで問題になるのが、ヘッドありでseleniumを動かしたい時です。WSLのubuntuからではヘッドありでchromeが立ち上がってくれません。しかし検証、開発の段階では実際にchromeを動かしながらコードを書きたいですよね。そこでwindows側のchromedriverと二刀流することにしました。

windowsのchromedriver

ここからwindowsのchromedriver.exeをダウンロードします。このchromedriver.exeをプログラム上で次のコードの4行目のようにパス指定することで、ヘッドありでseleniumを動かすことができます。この例ではCドライブ直下にchromedriver.exeを配置しています。

require 'selenium-webdriver'
require 'nokogiri'

Selenium::WebDriver::Chrome.driver_path = "/mnt/c/chromedriver.exe"
ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
caps = Selenium::WebDriver::Remote::Capabilities.chrome('chromeOptions' => { args: ["--user-agent=#{ua}", 'window-size=1280x800', '--incognito'] }) 
client = Selenium::WebDriver::Remote::Http::Default.new
client.read_timeout = 300
driver = Selenium::WebDriver.for :chrome, desired_capabilities: caps
driver.manage.timeouts.implicit_wait = 10

開発が完了し実際にクローラーを動かしたり、サーバー環境で動かす時には3行目を削除し、5行目を次のように書き換えます。

caps = Selenium::WebDriver::Remote::Capabilities.chrome('chromeOptions' => {args: ["--headless","--no-sandbox", "--disable-setuid-sandbox", "--disable-gpu", "--user-agent=#{ua}", 'window-size=1280x800']})

まとめ

運用時にはUbuntuだけで問題なくてもヘッドレスchromeでは開発がしにくいような時にこのような方法を試してみると効率がよくなるかもしれません。せっかくUbuntuとwindowsを同時に使えるWSL環境なので色々と試してみると面白いですね。