Seleniumを使うためには、WebDriverが必要ですが、ブラウザのバージョンと合っていないとエラーになってしまいます。どちらかが新しくてもだめです。

This version of ChromeDriver only supports Chrome version 90
Current browser version is 92.0.4515.15989.0.4389.128

自分でバージョンを調べて、ダウンロードしてもいいのですが、とっても面倒ですし、自動で動かしているものが突然動かなくなってしまうのはよくないです。

ということで、勝手にチェックしてインストールしてくれるようにコードを書いてしまいましょう。



常にDriverとChromeのバージョンを合わせる

常にDriverとChromeのバージョンを合わせるためには、 webdriverswebdrivers(RubyGems.org)) を使います。このgemは、バージョンがあってなかったらドライバーをダウンロードしてくれる便利なものです。

さらに、WebDriverを最初にインストールしておく必要もなく、なかったら勝手にインストールしてくれます。

require 'webdrivers'

install_dir = ENV["USERPROFILE"] + '/webdrivers'
install_dir.gsub!("\\","/")
Webdrivers.install_dir = install_dir

注意としては、ディレクトリの切れ目のパス区切り文字は、 "/" になります。 ENV で環境変数をとってくるとパス区切り文字は、 "\" になってしまうと思いますので、 gsub! で変換してます。



webdriversを使ったSeleniumの例

Googleに接続して検索結果を取得する例です。

require 'webdrivers'
require 'selenium-webdriver'


# Webdrivers.logger.level = :DEBUG  # debugする場合
install_dir = ENV["USERPROFILE"] + '/webdrivers'
install_dir.gsub!("\\","/")
Webdrivers.install_dir = install_dir

driver = Selenium::WebDriver.for :chrome
wait = Selenium::WebDriver::Wait.new(timeout: 10)

begin
  driver.get 'https://www.google.com/'
  driver.find_element(name: 'q').send_keys 'gogotorotan', :return
  first_result = wait.until{ driver.find_element(css: 'h3') }
  puts first_result.attribute('textContent')

ensure
  driver.quit

end



システムに接続されたデバイスが機能していません。のエラーは問題ない

下記エラーが発生しますが、特に問題ないと思われます。ちょっときもちわるいですが。

DevTools listening on ws://127.0.0.1:12345/devtools/browser/0321d1e4-ae2d-2a94-bd1a-edc764445954
[17332:13448:0703/234006.612:ERROR:device_event_log_impl.cc(214)] [19:10:06.613] USB: usb_device_handle_win.cc:1058 Failed to read descriptor from node connection: システムに接続されたデバイスが機能していません。 (0x1F)

下記参照のリンクを見ていただければ良いと思いますが、省電力モードで待機されているUSBデバイスのプロパティをChromeが読み取ろうとしているらしいです。


ちなみに、Pythonなら webdriver_manager になります。



参考:

2021/11/09