こんばんはエンジニアの眠れない夜です。
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のアップデートに苦労している人の参考になれば幸いです。
コメントを残す