【Node×Selenium】ChromeDriverのバージョンを自動アップデート

Node Selenium ChromeDriver 自動アップデート

こんばんはエンジニアの眠れない夜です。
Node.jsでSeleniumを使っていているとChromeのバージョンが上がってしまいドライバーの対応バージョンから外れてしまい、Chromeが立ち上がらなくなるということがあります。

JavaやPythonの場合はWebdriver-Manageというのを使うとドライバーを勝手に最新版に保ってくれます。

しかし、NodeでWebdriverManageにあたる物を探してみたのですが同じ名前はついているもののターミナルからコマンドを実行しないとアップデートをかけられません。

プログラムから実行して、最新版のドライバーをダウンロードして欲しいだけないんだけどな…

と思っていたところようやく欲しい物が見つかりました。

【Node】ChromeDriverのバージョンを自動アップデート selenium-download

selenium-downloadというモジュールを使えば常にChromeDriverとSeleniumを最新の状態に保ってくれるようです。

使い方はドキュメントにあるとおりでこれを実行すれば最新版のChromeDriverが現在のディレクトリのbinの中にダウンロードされます。

var selenium = require('selenium-download');

selenium.ensure(__dirname + '/bin', function (error) {
  if (error) console.error(error.stack);
  process.exit(0);
});

私は少し変更を加えてこんな感じでChromeのDriverのパスを取得する関数として関数にまとめて使っています。

const webdriver = require('selenium-webdriver');
const {Builder, By, until} = webdriver;
const chrome = require('selenium-webdriver/chrome');
import {WebElement} from "selenium-webdriver";

async function getDriverPath(): Promise{
try {
  const selenium = require('selenium-download');

# Driverをダウンロードするディレクトリを指定
const path = __dirname + '/bin';
console.log(path);

# Driverのダウンロードとアップデート
await selenium.ensure(path, function (error:any) {
if (error) console.error(error.stack);
});

# ChromeDriverのパスを返す。
return `${path}/chromedriver`;
} catch (error) {
  throw error;
}
}

async function startChrome(headless = true) {

# Driverのパスを取得する
let driverPath = await getDriverPath();
console.log(`driver${driverPath}`);

# Driverのパスを渡す
let service = new chrome.ServiceBuilder(driverPath).build();

#任意 ウィンドウのサイズ設定
const screen = {
  width: 1000,
  height: 800
};

# Chromeに設定を適応
chrome.setDefaultService(service);
const chromeOptions = new chrome.Options();
await chromeOptions.windowSize(screen);

# ヘッドレス用の分岐
if (headless) {
  log.info("headless");
  await chromeOptions.headless();
}

# Chromeを起動
this.driver = new Builder().forBrowser('chrome').setChromeOptions(chromeOptions).build();
log.info('start chromedriver');

return true;
}

※ インデントが消滅しているのはWordPressの仕様ですm(_ _)m

NodeでChromeDriverのアップデートに苦労している人の参考になれば幸いです。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください