SeleniumでEdge(Chromium版)のプロファイルを使う

Edgeのバージョン

Edgeには2つのバージョンがあります。

  • レガシー版Edge
    Windows10に標準機能として提供されていたEdge
    InternetExplorerから派生したEdgeHTMLベースのEdge
    (2021年3月9日サポート終了予定)
  • Chromium版Edge
    2020年1月15日にリリースされた、オーブソースであるChromiumベースのEdge
    (現在はこちらが提供されている)

レガシー版のEdgeは、プロファイルを切り替えることができません。
手動で操作する場合も、Seleniumで操作する場合も、同一のプロファイルを使用します。

Chomium版のEdgeは、プロファイルの切り替えが可能です。

Edge(Chomium版)のプロファイル

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

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

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

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

edge://version

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

動作

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

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

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

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

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

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

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

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

# msedge-selenium-toolsが必要
# pip install msedge-selenium-tools
from msedge.selenium_tools import Edge, EdgeOptions
#from selenium.webdriver.edge.options import Options

options = EdgeOptions()
options.use_chromium = True
options.add_argument('--user-data-dir=D:\\tmp\\Edge Data')
options.add_argument('--profile-directory=Profile1')
options.add_argument('--lang=en')
path = r'D:\tmp\driver\Edge\msedgedriver.exe'

driver = Edge(executable_path=path, options=options)
driver.get("edge://version")
#driver.quit()
/* selenium-java-4.0.0が必要
*  https://www.selenium.dev/downloads/
*/
package example;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;
public class edge_profile {
    public static void main( String[] args )
    {
        EdgeOptions options = new EdgeOptions();
        options.addArguments("--user-data-dir=D:\\tmp\\Edge Data");
        options.addArguments("--profile-directory=Profile1");
        System.setProperty("webdriver.edge.driver", "D:\\tmp\\driver\\Edge\\msedgedriver.exe");
        EdgeDriver driver = new EdgeDriver(options);
        driver.get("edge://version");
        //driver.quit();
    }
}
// Microsoft.Edge.SeleniumToolsが必要
using System;
using Microsoft.Edge.SeleniumTools;
//using OpenQA.Selenium.Edge;
namespace edge_profile
{
    class Program
    {
        static void Main(string[] args)
        {
            EdgeOptions options = new EdgeOptions();
            options.UseChromium = true;
            options.AddArgument("--user-data-dir=D:\\tmp\\Edge Data");
            options.AddArgument("--profile-directory=Profile1");
            options.AddArgument("--lang=en");
            String path = @"D:\tmp\driver\Edge";    //フォルダを指定
            EdgeDriver driver = new EdgeDriver(path, options);
            driver.Navigate().GoToUrl("edge://version");
            //driver.Quit();
        }
    }
}
' Microsoft.Edge.SeleniumToolsが必要
Imports Microsoft.Edge.SeleniumTools
'Imports OpenQA.Selenium.Edge
Module Module1
    Sub Main()
        Dim options = New EdgeOptions()
        options.UseChromium = True
        'エスケープなしでも通る
        options.AddArgument("--user-data-dir=D:\tmp\Edge Data")
        options.AddArgument("--profile-directory=Profile1")
        options.AddArgument("--lang=en")
        'フォルダを指定
        Dim path = "D:\\tmp\\driver\\Edge"
        Dim driver = New EdgeDriver(edgeDriverDirectory:=path, options:=options)
        driver.Navigate.GoToUrl("edge://version")
        'driver.Quit()
    End Sub
End Module
# selenium-webdriver 4.0.0が必要
# gem install selenium-webdriver --pre

gem "selenium-webdriver", "4.0.0.alpha7"
require "selenium-webdriver"

options = Selenium::WebDriver::EdgeChrome::Options.new
options.add_argument('--user-data-dir=D:\tmp\Edge Data')    #エスケープなしでも通る
options.add_argument('--profile-directory=Profile1')
options.add_argument('--lang=en')
Selenium::WebDriver::Edge::Service.driver_path = 'D:\tmp\driver\Edge\msedgedriver.exe'

driver = Selenium::WebDriver.for :edge_chrome , options: options
driver.get("edge://version")
#driver.quit()
/* edge-selenium-toolsが必要
*  npm install @microsoft/edge-selenium-tools
*/
let edge = require('selenium-webdriver/edge');
let options = new edge.Options();
options.setEdgeChromium(true);
options.addArguments("--user-data-dir=D:\\tmp\\Edge Data");
options.addArguments("--profile-directory=Profile1");
options.addArguments("--lang=en");

let path = "D:\\tmp\\driver\\edge\\msedgedriver.exe";
let service = new edge.ServiceBuilder(path).build();

(async () => {
    var driver = await edge.Driver.createSession(options, service);
    await driver.get("edge://version");
    //await driver.quit();
})();
edge://version

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

同一のユーザーデータディレクトリで、複数のEdgeDriverを操作することはできません。同時に2個以上のEdgeDriverを操作する場合は、–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

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