SeleniumでChromeのプロファイルを使う

Chromeのユーザープロファイル

Chromeのユーザー毎のデータ(履歴、ブックマーク、パスワード等)は、ユーザープロファイルに保存されます。
SeleniumでChromeDriverを動かす場合、デフォルトではユーザープロファイルは一時ディレクトリに作成され、終了後にクリアされます。ログイン情報を引き継ぎたい場合は、使用するユーザープロファイルを指定する必要があります。

ユーザープロファイルは、Chrome起動時のオプションで指定します。

コマンドプロンプトからChromeを起動
–user-data-dirユーザープロファイルの保存先を指定
–profile-directory使用するユーザープロファイルを指定

現在使用しているプロファイルは、chrome://versionで見ることができます。

chrome://version

上の画像では 
–user-data-dir:C:\Users\xxxxx\AppData\Local\Google\Chrome\User Data
–profile-directory:Profile 1
となります。

動作

–user-data-dirを指定しない場合

プロファイルは一時ファイルとして作成され、Chrome終了後に廃棄されます。

–profile-directoryを指定しない場合

ユーザープロファイルは–user-data-dirで指定したフォルダ内のデフォルトのプロファイル(通常はDefault)を使用します。

指定したフォルダが存在しない場合

–user-data-dir、–profile-directoryに指定したフォルダが存在しない場合は、自動でフォルダが作成されます(Windows環境でのみ確認)ので、タイプミスに注意しましょう。

ChromeDriverでのユーザープロファイルの指定

ChromeDriverのChromeOptionsクラスを利用します。
add_argumentメソッドを使用して、オプション項目を追加しています。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--user-data-dir=D:\\tmp\\User Data')
options.add_argument('--profile-directory=Profile1')
options.add_argument('--lang=en')
path = r'D:\tmp\driver\chromedriver_win32\chromedriver.exe'

driver = webdriver.Chrome(executable_path=path ,options=options)
driver.get("chrome://version")
#driver.quit()
package example;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class App { public static void main( String[] args ) { ChromeOptions options = new ChromeOptions(); options.addArguments("--user-data-dir=D:\\tmp\\User Data"); options.addArguments("--profile-directory=Profiel1"); options.addArguments("--lang=en"); String path = "D:\\tmp\\driver\\chromedriver_win32\\chromedriver.exe"; System.setProperty("webdriver.chrome.driver", path); WebDriver driver = new ChromeDriver(options); driver.get("chrome://version"); //driver.quit(); } }
using System;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace example
{
    class Program
    {
        static void Main(string[] args)
        {
            ChromeOptions options = new ChromeOptions();
            options.AddArgument("--user-data-dir=D:\\tmp\\User Data");
            options.AddArgument("--profile-directory=Profile1");
            options.AddArgument("--lang=en");
            String path = @"D:\tmp\driver\chromedriver_win32";    //フォルダを指定

            IWebDriver driver = new ChromeDriver(path, options);
            driver.Navigate().GoToUrl("chrome://version");
            //driver.Quit();
        }
    }
}
Imports OpenQA.Selenium.Chrome
Module Module1
    Sub Main()
       Dim options = New ChromeOptions()
        'エスケープなしでも通る
        options.AddArgument("--user-data-dir=D:\tmp\User Data")	     
        options.AddArgument("--profile-directory=Profile1")
        options.AddArgument("--lang=en")
        'フォルダを指定
       Dim path = "D:\\tmp\\driver\\chromedriver_win32"

       Dim driver = New ChromeDriver(chromeDriverDirectory:=path, options:=options)
        driver.Navigate.GoToUrl("chrome://version")
        'driver.Quit()
    End Sub
End Module
require "selenium-webdriver"

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument('--user-data-dir=D:\tmp\User Data')    #エスケープなしでも通る
options.add_argument('--profile-directory=Profiel1')
options.add_argument('--lang=en')
Selenium::WebDriver::Chrome.driver_path = 'D:\tmp\driver\chromedriver_win32\chromedriver.exe'

driver = Selenium::WebDriver.for :chrome , options: options
driver.get("chrome://version")
#driver.quit()
let webdriver = require('selenium-webdriver');
let chrome = require('selenium-webdriver/chrome');

var options = new chrome.Options();
options.addArguments("--user-data-dir=D:\\tmp\\User Data");
options.addArguments("--profile-directory=Profile1");
options.addArguments("--lang=en");
let path = "D:\\tmp\\driver\\chromedriver_win32\\chromedriver.exe";

(async () => {
    var driver = await new webdriver.Builder()
        .forBrowser('chrome')
        .setChromeOptions(options)
        .setChromeService(new chrome.ServiceBuilder(path))
        .build();    
    await driver.get("chrome://version");
    //await driver.quit();
})();
chrome://version

ユーザープロファイルの重複

同一のユーザーデータディレクトリで、複数のChromeDriverを操作することはできません。同時に2個以上のChromeDriverを操作する場合は、–user-data-dirの指定を分ける必要があります。

エラーメッセージ

InvalidArgumentException: invalid argument: user data directory is already in use, please specify a unique value for --user-data-dir argument, or don't use --user-data-dir

Chromeを手動で開いている場合も、ChromeDriver側で同じユーザーデータディレクトリを同時に使用することはできません。
ですから、ChromeDriver用のユーザーデータディレクトリ(–user-data-dir)は、手動用とは分けておいたほうがよいでしょう。