はじめに
Web自動化ツールは、複数のオンラインプラットフォームを扱う開発者、テスター、デジタルマーケターにとって欠かせないものです。自動テストを実行する場合でも、データをスクレイピングする場合でも、複数サイトにまたがってコンテンツを管理する場合でも、信頼できるブラウザ環境は重要です。特にブラウザとそのWebDriverの互換性を保つ必要があるため、セットアップはしばしば面倒になります。
課題
多くの開発者は、ブラウザ自動化環境を準備するときに同じような問題に直面します。
- ブラウザとドライバーのバージョン不一致
- ディスプレイパラメータ設定時の構成ミス
- 各マシンで繰り返される手動セットアップ
- 複数Webサイトにまたがるセッション管理
YouTube、小紅書、抖音などのプラットフォームを扱う場合、特にヘッドレス環境やXサーバーのディスプレイが関係する環境では、こうした問題がよりはっきり現れます。
包括的なソリューション
これらの問題に対処するために、私はWeb自動化向けにChromeまたはChromiumをセットアップするプロセスを自動化するスクリプトを作成しました。このスクリプトは、ブラウザのインストール、ドライバーのダウンロード、環境設定、エイリアス設定を一度に処理します。
主な機能
- ブラウザ選択:ChromeまたはChromiumのどちらかをインストールできます。
- 自動バージョン照合:ブラウザのバージョンを検出し、対応するドライバーをダウンロードします。
- 設定可能なディスプレイ:
:0や:1など、Xディスプレイサーバーを指定できます。 - 事前設定済みエイリアス:主要プラットフォーム向けに、すぐ使えるコマンドを作成します。
- 検証:ブラウザ、ドライバー、エイリアスが利用可能か確認します。
スクリプトの使い方
このスクリプトは、シンプルでありながら柔軟に使えるよう設計されています。
# デフォルトでの基本的な使い方:Chrome と display :0
./install_chrome_driver_for_selenium.sh
# Chrome の代わりに Chromium をインストール
./install_chrome_driver_for_selenium.sh chromium
# 別のディスプレイを使用
./install_chrome_driver_for_selenium.sh --display=:1
# オプションを組み合わせる
./install_chrome_driver_for_selenium.sh chromium --display=:2
新しいLinuxマシンで実行する前に、通常必要な依存関係が利用可能であることを確認してください。
sudo apt update
sudo apt install -y wget gpg unzip
このスクリプトはaptを備えたDebianまたはUbuntu系の環境を想定しており、ドライバーを/usr/local/binに書き込むため、インストール手順ではsudoを使用します。
スクリプト
#!/bin/bash
# install_chrome_driver_for_selenium.sh
# Automatically installs Chrome/Chromium, the matching driver, and sets up aliases
# Usage: ./install_chrome_driver_for_selenium.sh [chrome|chromium] [--display=:X]
set -e # Exit on error
# Function to display usage
usage() {
echo "Usage: $0 [chrome|chromium] [--display=:X]"
echo " chrome|chromium - Browser to install (default: chrome)"
echo " --display=:X - X display to use (default: :0)"
echo "Examples:"
echo " $0 # Install Chrome with display :0"
echo " $0 chromium # Install Chromium with display :0"
echo " $0 chrome --display=:1 # Install Chrome with display :1"
}
# Function to install Chrome
install_chrome() {
echo "=== Installing Google Chrome ==="
# Check if Chrome is already installed
if command -v google-chrome &> /dev/null; then
echo "Google Chrome is already installed."
else
echo "Adding Google Chrome repository..."
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/google-chrome-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome-keyring.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list > /dev/null
echo "Updating package lists..."
sudo apt update
echo "Installing Google Chrome..."
sudo apt install -y google-chrome-stable
fi
}
# Function to install Chromium
install_chromium() {
echo "=== Installing Chromium ==="
# Check if Chromium is already installed
if command -v chromium-browser &> /dev/null; then
echo "Chromium is already installed."
else
echo "Installing Chromium..."
sudo apt update
sudo apt install -y chromium-browser
fi
}
# Function to get Chrome version
get_chrome_version() {
echo "=== Detecting Chrome version ==="
CHROME_VERSION=$(google-chrome --version | cut -d ' ' -f 3)
echo "Detected Google Chrome version: $CHROME_VERSION"
}
# Function to get Chromium version
get_chromium_version() {
echo "=== Detecting Chromium version ==="
CHROMIUM_VERSION=$(chromium-browser --version | cut -d ' ' -f 2)
echo "Detected Chromium version: $CHROMIUM_VERSION"
}
# Function to download Chrome Driver
download_chrome_driver() {
echo "=== Downloading Chrome Driver for version $CHROME_VERSION ==="
# Download the appropriate driver
wget -q -O chromedriver.zip "https://storage.googleapis.com/chrome-for-testing-public/$CHROME_VERSION/linux64/chromedriver-linux64.zip"
# Unzip the driver
unzip -q -o chromedriver.zip
# Move to /usr/local/bin
sudo mv chromedriver-linux64/chromedriver /usr/local/bin/chromedriver
sudo chmod +x /usr/local/bin/chromedriver
# Clean up
rm -rf chromedriver.zip chromedriver-linux64
echo "Chrome Driver installed to /usr/local/bin/chromedriver"
}
# Function to download Chromium Driver (uses chrome driver underneath)
download_chromium_driver() {
echo "=== Downloading Chromium Driver for version $CHROMIUM_VERSION ==="
# Download the appropriate driver
# Note: For newer versions, Chromium uses the same driver as Chrome
wget -q -O chromedriver.zip "https://storage.googleapis.com/chrome-for-testing-public/$CHROMIUM_VERSION/linux64/chromedriver-linux64.zip"
# Unzip the driver
unzip -q -o chromedriver.zip
# Move to /usr/local/bin
sudo mv chromedriver-linux64/chromedriver /usr/local/bin/chromedriver
sudo chmod +x /usr/local/bin/chromedriver
# Create a symlink for chromium-driver if it doesn't exist
if [ ! -f /usr/local/bin/chromium-driver ]; then
sudo ln -s /usr/local/bin/chromedriver /usr/local/bin/chromium-driver
fi
# Clean up
rm -rf chromedriver.zip chromedriver-linux64
echo "Chromium Driver installed to /usr/local/bin/chromedriver with symlink at /usr/local/bin/chromium-driver"
}
# Function to set up the aliases
setup_chrome_aliases() {
echo "=== Setting up Chrome aliases with display $DISPLAY_NUM ==="
# Create the scripts directory if it doesn't exist
mkdir -p ~/scripts
# Create the aliases file with the specified display
cat > ~/scripts/chrome_aliases.sh << EOF
#!/bin/bash
# Chrome aliases for various platforms
# Generated by install_chrome_driver_for_selenium.sh
# Create logs directory if it doesn't exist
mkdir -p "$HOME/chrome_dev_session_logs"
# Chrome aliases with DISPLAY=$DISPLAY_NUM
alias start_chrome_xhs='DISPLAY=$DISPLAY_NUM google-chrome --hide-crash-restore-bubble --remote-debugging-port=5003 --user-data-dir="$HOME/chrome_dev_session_5003" https://creator.xiaohongshu.com/creator/post > "$HOME/chrome_dev_session_logs/chrome_xhs.log" 2>&1'
alias start_chrome_douyin='DISPLAY=$DISPLAY_NUM google-chrome --hide-crash-restore-bubble --remote-debugging-port=5004 --user-data-dir="$HOME/chrome_dev_session_5004" https://creator.douyin.com/creator-micro/content/upload > "$HOME/chrome_dev_session_logs/chrome_douyin.log" 2>&1'
alias start_chrome_bilibili='DISPLAY=$DISPLAY_NUM google-chrome --hide-crash-restore-bubble --remote-debugging-port=5005 --user-data-dir="$HOME/chrome_dev_session_5005" https://member.bilibili.com/platform/upload/video/frame > "$HOME/chrome_dev_session_logs/chrome_bilibili.log" 2>&1'
alias start_chrome_shipinhao='DISPLAY=$DISPLAY_NUM google-chrome --hide-crash-restore-bubble --remote-debugging-port=5006 --user-data-dir="$HOME/chrome_dev_session_5006" https://channels.weixin.qq.com/post/create > "$HOME/chrome_dev_session_logs/chrome_shipinhao.log" 2>&1'
alias start_chrome_youtube='DISPLAY=$DISPLAY_NUM google-chrome --hide-crash-restore-bubble --remote-debugging-port=9222 --user-data-dir="$HOME/chrome_dev_session_9222" https://youtube.com/upload > "$HOME/chrome_dev_session_logs/chrome_youtube.log" 2>&1'
alias start_chrome_without_y2b='start_chrome_xhs & start_chrome_douyin & start_chrome_bilibili'
alias start_chrome_all='start_chrome_xhs & start_chrome_douyin & start_chrome_bilibili & start_chrome_shipinhao & start_chrome_youtube'
EOF
# Make the file executable
chmod +x ~/scripts/chrome_aliases.sh
# Check if already sourced in .bashrc
if ! grep -q "source ~/scripts/chrome_aliases.sh" ~/.bashrc; then
echo "# Source Chrome aliases" >> ~/.bashrc
echo "source ~/scripts/chrome_aliases.sh" >> ~/.bashrc
echo "Added source command to ~/.bashrc"
else
echo "Chrome aliases already sourced in ~/.bashrc"
fi
# Source the file in the current session
source ~/scripts/chrome_aliases.sh
echo "Chrome aliases have been set up and are ready to use"
}
# Function to set up the aliases for Chromium
setup_chromium_aliases() {
echo "=== Setting up Chromium aliases with display $DISPLAY_NUM ==="
# Create the scripts directory if it doesn't exist
mkdir -p ~/scripts
# Create the aliases file with the specified display
cat > ~/scripts/chromium_aliases.sh << EOF
#!/bin/bash
# Chromium aliases for various platforms
# Generated by install_chrome_driver_for_selenium.sh
# Create logs directory if it doesn't exist
mkdir -p "$HOME/chromium_dev_session_logs"
# Chromium aliases with DISPLAY=$DISPLAY_NUM
alias start_chromium_xhs='DISPLAY=$DISPLAY_NUM chromium-browser --hide-crash-restore-bubble --remote-debugging-port=5003 --user-data-dir="$HOME/chromium_dev_session_5003" https://creator.xiaohongshu.com/creator/post > "$HOME/chromium_dev_session_logs/chromium_xhs.log" 2>&1'
alias start_chromium_douyin='DISPLAY=$DISPLAY_NUM chromium-browser --hide-crash-restore-bubble --remote-debugging-port=5004 --user-data-dir="$HOME/chromium_dev_session_5004" https://creator.douyin.com/creator-micro/content/upload > "$HOME/chromium_dev_session_logs/chromium_douyin.log" 2>&1'
alias start_chromium_bilibili='DISPLAY=$DISPLAY_NUM chromium-browser --hide-crash-restore-bubble --remote-debugging-port=5005 --user-data-dir="$HOME/chromium_dev_session_5005" https://member.bilibili.com/platform/upload/video/frame > "$HOME/chromium_dev_session_logs/chromium_bilibili.log" 2>&1'
alias start_chromium_shipinhao='DISPLAY=$DISPLAY_NUM chromium-browser --hide-crash-restore-bubble --remote-debugging-port=5006 --user-data-dir="$HOME/chromium_dev_session_5006" https://channels.weixin.qq.com/post/create > "$HOME/chromium_dev_session_logs/chromium_shipinhao.log" 2>&1'
alias start_chromium_youtube='DISPLAY=$DISPLAY_NUM chromium-browser --hide-crash-restore-bubble --remote-debugging-port=9222 --user-data-dir="$HOME/chromium_dev_session_9222" https://youtube.com/upload > "$HOME/chromium_dev_session_logs/chromium_youtube.log" 2>&1'
alias start_chromium_without_y2b='start_chromium_xhs & start_chromium_douyin & start_chromium_bilibili'
alias start_chromium_all='start_chromium_xhs & start_chromium_douyin & start_chromium_bilibili & start_chromium_shipinhao & start_chromium_youtube'
EOF
# Make the file executable
chmod +x ~/scripts/chromium_aliases.sh
# Check if already sourced in .bashrc
if ! grep -q "source ~/scripts/chromium_aliases.sh" ~/.bashrc; then
echo "# Source Chromium aliases" >> ~/.bashrc
echo "source ~/scripts/chromium_aliases.sh" >> ~/.bashrc
echo "Added source command to ~/.bashrc"
else
echo "Chromium aliases already sourced in ~/.bashrc"
fi
# Source the file in the current session
source ~/scripts/chromium_aliases.sh
echo "Chromium aliases have been set up and are ready to use"
}
# Function to verify installation
verify_installation() {
echo "=== Verifying installation ==="
# Check if Chrome/Chromium is installed
if [ "$BROWSER_TYPE" = "chrome" ]; then
if ! command -v google-chrome &> /dev/null; then
echo "ERROR: Google Chrome is not installed properly"
exit 1
fi
echo "✓ Google Chrome is installed"
else
if ! command -v chromium-browser &> /dev/null; then
echo "ERROR: Chromium is not installed properly"
exit 1
fi
echo "✓ Chromium is installed"
fi
# Check if the driver is installed
if ! command -v chromedriver &> /dev/null; then
echo "ERROR: Chrome Driver is not installed properly"
exit 1
fi
echo "✓ Chrome Driver is installed"
# Verify driver version matches browser version
if [ "$BROWSER_TYPE" = "chrome" ]; then
CHROME_CURRENT_VERSION=$(google-chrome --version | cut -d ' ' -f 3)
DRIVER_VERSION=$(chromedriver --version | cut -d ' ' -f 2)
if [[ "$DRIVER_VERSION" == "$CHROME_CURRENT_VERSION"* ]]; then
echo "✓ Chrome Driver version $DRIVER_VERSION matches Chrome version $CHROME_CURRENT_VERSION"
else
echo "WARNING: Chrome Driver version ($DRIVER_VERSION) might not match Chrome version ($CHROME_CURRENT_VERSION)"
fi
else
CHROMIUM_CURRENT_VERSION=$(chromium-browser --version | cut -d ' ' -f 2)
DRIVER_VERSION=$(chromedriver --version | cut -d ' ' -f 2)
if [[ "$DRIVER_VERSION" == "$CHROMIUM_CURRENT_VERSION"* ]]; then
echo "✓ Chrome Driver version $DRIVER_VERSION matches Chromium version $CHROMIUM_CURRENT_VERSION"
else
echo "WARNING: Chrome Driver version ($DRIVER_VERSION) might not match Chromium version ($CHROMIUM_CURRENT_VERSION)"
fi
fi
# Check if aliases are set up
if [ "$BROWSER_TYPE" = "chrome" ]; then
if ! type start_chrome_youtube &> /dev/null; then
echo "WARNING: Chrome aliases are not loaded in the current session"
echo "Please run: source ~/.bashrc"
else
echo "✓ Chrome aliases are set up correctly"
fi
else
if ! type start_chromium_youtube &> /dev/null; then
echo "WARNING: Chromium aliases are not loaded in the current session"
echo "Please run: source ~/.bashrc"
else
echo "✓ Chromium aliases are set up correctly"
fi
fi
echo ""
echo "Installation completed successfully!"
if [ "$BROWSER_TYPE" = "chrome" ]; then
echo "You can now use the following commands:"
echo " start_chrome_xhs - Start Chrome for Xiaohongshu"
echo " start_chrome_douyin - Start Chrome for Douyin"
echo " start_chrome_bilibili - Start Chrome for Bilibili"
echo " start_chrome_shipinhao - Start Chrome for Shipinhao"
echo " start_chrome_youtube - Start Chrome for YouTube"
echo " start_chrome_without_y2b - Start Chrome for all except YouTube"
echo " start_chrome_all - Start Chrome for all platforms"
else
echo "You can now use the following commands:"
echo " start_chromium_xhs - Start Chromium for Xiaohongshu"
echo " start_chromium_douyin - Start Chromium for Douyin"
echo " start_chromium_bilibili - Start Chromium for Bilibili"
echo " start_chromium_shipinhao - Start Chromium for Shipinhao"
echo " start_chromium_youtube - Start Chromium for YouTube"
echo " start_chromium_without_y2b - Start Chromium for all except YouTube"
echo " start_chromium_all - Start Chromium for all platforms"
fi
echo ""
echo "Using display: $DISPLAY_NUM"
echo "Note: If the aliases aren't available, run 'source ~/.bashrc' to load them"
}
# Default values
BROWSER_TYPE="chrome"
DISPLAY_NUM=":0"
# Parse command line arguments
while [[ $# -gt 0 ]]; do
case $1 in
chrome|chromium)
BROWSER_TYPE="$1"
shift
;;
--display=*)
DISPLAY_NUM="${1#*=}"
shift
;;
--help|-h)
usage
exit 0
;;
*)
echo "Unknown option: $1"
usage
exit 1
;;
esac
done
# Main execution
echo "Installing $BROWSER_TYPE and its WebDriver..."
echo "Using display: $DISPLAY_NUM"
# Install the selected browser
if [ "$BROWSER_TYPE" = "chrome" ]; then
install_chrome
get_chrome_version
download_chrome_driver
setup_chrome_aliases
else
install_chromium
get_chromium_version
download_chromium_driver
setup_chromium_aliases
fi
# Verify installation
verify_installation
echo "Done!"
コンポーネントを理解する
ブラウザとドライバーのインストール
このスクリプトはまず、インストールするブラウザをChromeまたはChromiumのどちらにするか判定します。次に、ブラウザがまだ存在しない場合はインストールします。バージョン番号を検出した後、GoogleのChrome for Testingリポジトリから対応するWebDriverをダウンロードします。
実際には、ブラウザのパッケージングはディストリビューションによって異なることがあります。検出された正確なバージョンがChrome for Testingのストレージパスで利用できない場合は、インストール済みブラウザのバージョンをローカルで確認し、公式のChrome for Testing availabilityページから最も近い互換性のある安定版ドライバーをダウンロードしてください。
ディスプレイ設定
Xディスプレイ設定は、特にDockerコンテナ、仮想デスクトップ、リモートサーバーでのブラウザ自動化において重要です。--displayオプションを使うと、ブラウザエイリアスが使用するディスプレイを選択できます。
たとえば、自動化用デスクトップが:1で動作している場合は、次のようにセットアップを起動します。
./install_chrome_driver_for_selenium.sh chrome --display=:1
アクティブなディスプレイは、次のようなコマンドで確認できます。
echo "$DISPLAY"
xdpyinfo -display :1 >/dev/null && echo "display is available"
生産性を高めるエイリアス
特に便利な機能の一つが、複数プラットフォーム向けにすぐ使えるエイリアスを作成することです。
start_chrome_youtube:YouTubeのアップロードページをChromeで開きます。start_chrome_douyin:抖音のクリエイターポータルをChromeで開きます。start_chrome_bilibili:Bilibiliのアップロード画面をChromeで開きます。start_chrome_xhs:小紅書のクリエイターページをChromeで開きます。start_chrome_shipinhao:WeChat Channelsの投稿作成画面をChromeで開きます。
各エイリアスは、別々のリモートデバッグポートと別々のユーザーデータディレクトリを使用します。これにより、セッションを分離しやすくなる一方で、Selenium、Playwright、または直接Chrome DevTools Protocolを使うクライアントなどの自動化ツールが、実行中のブラウザへ接続できるようになります。
インストール後、エイリアスがすぐに利用できない場合は、シェル設定を再読み込みしてください。
source ~/.bashrc
次に、エイリアスが存在することを確認します。
type start_chrome_youtube
実際の活用例
このスクリプトは、特に次のような用途で役立ちます。
- コンテンツクリエイター:複数プラットフォームへのアップロードを管理する人。
- デジタルマーケター:コンテンツ配信ワークフローを自動化する人。
- QAエンジニア:一貫したブラウザテスト環境を必要とする人。
- データサイエンティスト:Webスクレイピング用のブラウザ環境を設定する人。
- DevOpsチーム:開発マシンやサーバー全体でブラウザ自動化を標準化するチーム。
運用メモ
いくつかの実用的なチェックを行うことで、このセットアップはより信頼性の高いものになります。
- ドライバー問題をデバッグする前に、
google-chrome --versionまたはchromium-browser --versionを実行します。 - インストール後に
chromedriver --versionを実行し、メジャーバージョンをブラウザと比較します。 - Cookieやセッションが衝突しないよう、各プラットフォームを別々の
--user-data-dirに分けます。 - 同じリモートデバッグポートで無関係な自動化ジョブを実行することは避けます。
- 認証済みブラウザプロファイルにはアクティブなセッションが含まれる可能性があるため、機密データとして扱います。
まとめ
ブラウザ自動化は、何時間ものセットアップや設定から始まるべきではありません。このスクリプトを使えば、対応するドライバー、設定可能なディスプレイ、一般的なワークフロー向けの便利なエイリアスを備えた、実用的なブラウザ自動化環境を数分で準備できます。
開発者、テスター、コンテンツクリエイター、データワーカーのいずれであっても、このアプローチは反復的なセットアップ作業を取り除き、本来の自動化タスクに集中できるようにします。ワークフローが成長するにつれて、このスクリプトにはさらに多くのエイリアス、追加のブラウザプロファイル、プロジェクト固有の起動フラグを拡張していくこともできます。
