Charger un profil Chrome avec Selenium WebDriver en Java
Lancer Chrome via Selenium avec un profil utilisateur existant permet de conserver les cookies de connexion, les extensions installées, les favoris et les préférences. Très pratique pour tester des scénarios qui nécessitent une session authentifiée ou une extension spécifique.
Dépendance Maven
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.28.0</version>
</dependency>
Trouver le dossier de profil Chrome
Sur votre machine, ouvrez chrome://version/ dans Chrome — la ligne Profile Path donne le chemin. Il est typiquement :
- Windows :
C:\Users\<vous>\AppData\Local\Google\Chrome\User Data\Default - macOS :
~/Library/Application Support/Google/Chrome/Default - Linux :
~/.config/google-chrome/Default
Le dossier parent (User Data) contient tous les profils ; le sous-dossier Default est le profil principal (Profile 1, Profile 2… pour les autres).
Charger le profil avec ChromeOptions
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class ChromeAvecProfil {
public static void main(String[] args) {
ChromeOptions options = new ChromeOptions();
// Dossier parent qui contient les profils
options.addArguments("--user-data-dir=C:\\Users\\vous\\AppData\\Local\\Google\\Chrome\\User Data");
// Nom du sous-dossier à utiliser
options.addArguments("--profile-directory=Default");
WebDriver driver = new ChromeDriver(options);
driver.get("https://github.com");
// GitHub reconnaît la session, aucune saisie de mot de passe requise
System.out.println(driver.getTitle());
driver.quit();
}
}
⚠ Chrome doit être fermé avant de lancer le test, sinon SessionNotCreatedException. Chrome ne permet qu'une seule instance par profil.
Créer un profil dédié aux tests
Plus propre : utiliser un profil isolé pour ne pas polluer votre navigateur quotidien.
ChromeOptions options = new ChromeOptions();
options.addArguments("--user-data-dir=/tmp/selenium-chrome-profile");
WebDriver driver = new ChromeDriver(options);
Le premier lancement crée le profil ; les suivants le réutilisent avec les cookies accumulés. Pour repartir à zéro, supprimez simplement le dossier.
Installer une extension dans le profil
import java.io.File;
ChromeOptions options = new ChromeOptions();
options.addExtensions(new File("/chemin/vers/extension.crx"));
WebDriver driver = new ChromeDriver(options);
L'extension sera disponible uniquement dans le contexte de la session Selenium.
Gérer le chromedriver automatiquement
Depuis Selenium 4.6, Selenium Manager télécharge automatiquement le bon ChromeDriver correspondant à votre version de Chrome. Plus besoin de gérer manuellement chromedriver.exe.
Pour Selenium plus anciens, utilisez WebDriverManager :
import io.github.bonigarcia.wdm.WebDriverManager;
WebDriverManager.chromedriver().setup();
Options utiles
| Argument | Effet |
|---|---|
--headless=new | Chrome sans interface graphique |
--disable-extensions | Désactiver toutes les extensions |
--incognito | Mode navigation privée |
--window-size=1920,1080 | Fixer la taille de la fenêtre |
--disable-gpu | Désactiver l'accélération GPU (utile en CI) |
--no-sandbox | Requis sous Docker / certains CI |
Pièges fréquents
- Chrome est déjà ouvert → erreur "user data directory already in use". Tuer tous les processus Chrome avant le test.
- Chemin avec espaces sous Windows : ne pas échapper manuellement, laisser Java et Chrome gérer.
- Version ChromeDriver obsolète : après une mise à jour automatique de Chrome, Selenium Manager prend le relais ; sur anciens setups, re-télécharger
chromedriver.exe. - Profil corrompu : si Chrome affiche un message de récupération, supprimer les fichiers
Current SessionetCurrent Tabsdu profil.
En production CI
Pour du CI/CD, n'utilisez jamais votre profil personnel. Créez un profil temporaire par exécution :
Path tempProfile = Files.createTempDirectory("chrome-test-");
options.addArguments("--user-data-dir=" + tempProfile.toAbsolutePath());
// ... tests ...
Files.walk(tempProfile).sorted(Comparator.reverseOrder()).forEach(p -> p.toFile().delete());
Ce pattern garantit que chaque build part d'un état propre et n'écrase pas de données réelles.