Une plateforme low-code alliant la simplicité du no-code à la puissance du full-code 🚀
Commencez gratuitement
3 mars 2025
9
min lire

Navigateur Java Headless : un guide complet

Georges Miloradovitch
Chercheur, rédacteur et intervieweur de cas d'utilisation
Table des matières

Principaux plats à emporter:

  • Qu'est-ce qu'un navigateur sans tête ? Un navigateur qui traite le contenu Web par programmation sans interface visuelle.
  • Avantages pour les projets Java :
    • La vitesse: Fonctionne 2 à 15 fois plus rapidement en ignorant le rendu visuel.
    • Rendement : Utilise moins de mémoire et de CPU, idéal pour les tests parallèles.
    • Automation: Idéal pour les tâches telles que les tests, le scraping et la surveillance des performances.
  • Outils populaires : Pilote Web Selenium et Unité HTML sont largement utilisés pour l’automatisation Java.

Comparaison rapide : navigateurs headless et classiques

Fonctionnalité Mode sans tête Mode régulier
Vitesse d'exécution Plus rapide (2 à 15 fois) Standard et repiquage
Utilisation de la mémoire Coût en adjuvantation plus élevé. Meilleure performance du béton
Débogage visuel Indisponible Disponible
Intégration CI/CD Bien adapté Moins flexible

Dans ce guide, vous apprendrez à configurer des navigateurs Java headless, à configurer des outils tels que Selenium et HtmlUnit et à optimiser les flux de travail d'automatisation pour plus de rapidité et de fiabilité.

Tests de navigateur sans tête dans Pilote Web Selenium avec Java

Pilote Web Selenium

Premiers pas avec les navigateurs Java Headless

Voici comment vous pouvez configurer un navigateur Java headless en utilisant les bons outils et configurations.

Logiciel requis

Pour commencer, vous aurez besoin des éléments suivants :

  • Kit de développement Java (JDK):Installez la dernière version stable et assurez-vous de configurer correctement les variables d’environnement.
  • Pilote Web Selenium: Téléchargez la version 4.6.0 ou ultérieure depuis le site officiel de Selenium.
  • Pilotes de navigateur: Pour Chrome, téléchargez le pilote ChromeDriver correspondant à la version de votre navigateur. Placez le pilote dans un répertoire dédié pour un accès facile.

Une fois que vous les avez, intégrez-les dans votre projet en utilisant Maven or gradle.

Configuration Maven/gradle

Maven

Si vous utilisez Maven, créez un nouveau projet et incluez les dépendances suivantes dans votre pom.xml fichier:

<dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.6.0</version>
    </dependency>

    <dependency>
        <groupId>org.htmlunit</groupId>
        <artifactId>htmlunit</artifactId>
        <version>4.10.0</version>
    </dependency>

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.6.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Vous devrez également définir la propriété système pour ChromeDriver dans votre code :

System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");

Cela garantit que Selenium peut localiser le ChromeDriver lors de l'exécution des tests.

Pourquoi utiliser des navigateurs sans tête ?

Les navigateurs headless sont parfaits pour les tests automatisés et le scraping Web. Par exemple, Optimizely ont réussi à réduire considérablement leur temps de test - de 8 heures à seulement 1 heure - en utilisant des tests parallèles avec des outils comme Automatisation de BrowserStack.

« Selenium automatise les navigateurs. C'est tout ! » - Selenium

« HtmlUnit est un « navigateur sans interface graphique pour les programmes Java ». Il modélise les documents HTML et fournit une API qui vous permet d'appeler des pages, de remplir des formulaires, de cliquer sur des liens, etc., comme vous le faites dans votre navigateur « normal ». » - HtmlUnit

Guide de configuration de Selenium WebDriver

La configuration de Selenium WebDriver en mode headless peut améliorer considérablement les performances des tests. Le mode headless de Chrome, introduit dans la version 59, permet d'automatiser les tests sans interface graphique, ce qui les rend plus rapides et plus efficaces.

Configuration de Chrome pour le mode sans tête

Pour activer le mode sans tête dans Chrome, utilisez le ChromeOptions classe. Vous trouverez ci-dessous deux façons de le configurer :

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
WebDriver driver = new ChromeDriver(options);

Ou bien:

ChromeOptions options = new ChromeOptions();
options.setHeadless(true);
WebDriver driver = new ChromeDriver(options);

Principales différences : navigateurs headless et classiques

Une fois que votre navigateur headless est prêt, vous pouvez commencer à automatiser les tâches. Voici une comparaison rapide des navigateurs headless et classiques :

Fonctionnalité Mode sans tête Mode régulier
Vitesse d'exécution 2 à 15 fois plus rapide Standard et repiquage
Utilisation de la mémoire Coût en adjuvantation plus élevé. Meilleure performance du béton
La consommation de ressources Coût en adjuvantation plus élevé. Meilleure performance du béton
Débogage visuel Indisponible Disponible
Intégration CI/CD Bien adapté Moins flexible

Cette comparaison met en évidence pourquoi les navigateurs headless sont idéaux pour les workflows d’automatisation, en particulier dans les pipelines CI/CD.

Conseils pour des tests efficaces sans tête

Lorsque vous travaillez avec des navigateurs sans tête, gardez ces conseils à l’esprit :

  • Définissez des dimensions de fenêtre appropriées et utilisez des attentes explicites pour garantir que les éléments se chargent correctement et gèrent efficacement les appels AJAX.
  • Utilisez des captures d'écran pour la validation car le débogage visuel n'est pas une option.
  • Sachez que le mode sans tête peut ne pas détecter les problèmes visuels.

« Bien que PhantomJs ne soit pas en soi un framework de test, c'est un très bon canari dans une mine de charbon pour vous donner une certaine confiance ; si vos tests réussissent, vous pouvez avoir un haut degré de confiance que votre code est correct. » - Rob Friesel, auteur de Livre de recettes PhantomJS

Commandes de base pour l'automatisation

Voici quelques commandes essentielles pour démarrer avec l’automatisation Selenium :

// Navigate to a URL
driver.get("https://your-website.com");

// Locate and interact with elements
WebElement element = driver.findElement(By.id("elementId"));
element.sendKeys("test input");

// Capture a screenshot
File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File("./screenshot.png"));

Pour des tests stables, agrandissez la fenêtre du navigateur après le chargement de la page et définissez le niveau de zoom sur 100 %. Cela garantit un placement cohérent des éléments et améliore la fiabilité des tests.

sbb-itb-23997f1

Unité HTML Guide d'implémentation

Unité HTML

HtmlUnit est un outil léger conçu pour les tâches d'automatisation Java où le rendu visuel n'est pas nécessaire. C'est une option solide pour rationaliser les processus qui ne nécessitent pas une interface de navigateur complète.

Fonctionnalités de HtmlUnit

HtmlUnit apporte une gamme de fonctionnalités, ce qui en fait un choix pratique pour l'automatisation sans tête :

Catégorie d'entité Compétences
Support de protocole Gère HTTP, HTTPS et SSL complet
Authentification Prend en charge l'authentification de base et NTLM
JavaScript Fonctionne avec les bibliothèques AJAX avancées et la gestion des événements
Traitement des demandes Prend en charge des méthodes telles que POST, GET, HEAD et DELETE
Options réseau Inclut la prise en charge du serveur proxy et les paramètres d'en-tête personnalisés
Émulation de navigateur Simule des navigateurs comme Chrome, Firefox et Edge

Sa nature sans tête accélère l’exécution des tests, ce qui en fait une solution idéale pour les pipelines d’intégration continue.

« HtmlUnit est un « navigateur sans interface graphique pour les programmes Java ». Il modélise les documents HTML et fournit une API qui vous permet d'appeler des pages, de remplir des formulaires, de cliquer sur des liens, etc., comme vous le faites dans votre navigateur « normal ». » - HtmlUnit

Étapes de configuration de HtmlUnitDriver

Démarrer avec HtmlUnitDriver est simple :

  1. Ajouter des dépendances Pour les projets Maven, incluez la dépendance suivante :
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>htmlunit3-driver</artifactId>
        <version>4.29.0</version>
    </dependency>
    
  2. Configurer le pilote et activer JavaScript Voici un exemple de configuration de HtmlUnitDriver avec prise en charge JavaScript :
    final HtmlUnitDriverOptions driverOptions = new HtmlUnitDriverOptions(BrowserVersion.FIREFOX);
    driverOptions.setCapability(HtmlUnitOption.optThrowExceptionOnScriptError, false);
    HtmlUnitDriver driver = new HtmlUnitDriver(driverOptions);
    

Cette configuration est rapide et efficace, ce qui en fait un choix judicieux pour les tests axés sur les performances plutôt que sur l'émulation complète du navigateur.

Bien que HtmlUnit ne soit pas idéal pour tester des applications front-end complexes et lourdes en JavaScript, il excelle dans des tâches telles que le scraping Web de base, les tests d'API et les soumissions de formulaires automatisées. La dernière version (version 4.10.0 du 22 février 2025) améliore la gestion de JavaScript et ajoute davantage de fonctionnalités, ce qui permet à HtmlUnit de rester pertinent dans les flux de travail d'automatisation modernes.

Fonctionnalités et méthodes avancées

Des outils et techniques avancés peuvent faire passer l'automatisation de votre navigateur sans tête Java au niveau supérieur, rendant les tâches de test et de scraping plus efficaces et plus efficientes.

Prendre des captures d'écran

La capture de captures d'écran pleine page est un besoin courant pour le débogage ou la documentation. Des outils comme un coup simplifiez ce processus et fournissez des résultats de haute qualité.

// Using Selenium WebDriver with aShot  
WebDriver driver = new ChromeDriver(options);  
Screenshot screenshot = new AShot()  
  .shootingStrategy(ShootingStrategies.viewportPasting(1000))  
  .takeScreenshot(driver);  
ImageIO.write(screenshot.getImage(), "PNG", new File("full-page-screenshot.png"));

Voici quelques paramètres recommandés pour garantir la cohérence :

Paramètre Valeur recommandée Objectif
Largeur de l'écran 1920px Résolution de bureau standard
Hauteur de l'écran 1080px Assure une capture cohérente
Format Image PNG Maintient une qualité sans perte
DPI 96 Densité d'écran standard

Une fois les captures d’écran configurées, l’étape suivante consiste à gérer les sessions pour des flux de travail automatisés plus fluides.

Gestion des sessions de connexion

La gestion des sessions est essentielle pour maintenir l'état des interactions automatisées, en particulier dans les scénarios nécessitant une authentification. Vous pouvez enregistrer et réutiliser les cookies pour rationaliser ce processus :

// Save cookies after successful login  
Set<Cookie> cookies = driver.manage().getCookies();  
FileWriter writer = new FileWriter("cookies.json");  
new Gson().toJson(cookies, writer);  
writer.close();

// Load cookies for subsequent sessions  
FileReader reader = new FileReader("cookies.json");  
Cookie[] cookies = new Gson().fromJson(reader, Cookie[].class);  
for (Cookie cookie : cookies) {  
  driver.manage().addCookie(cookie);  
}

Pour les applications avec authentification à deux facteurs (2FA), la génération de mots de passe à usage unique (OTP) par programmation peut simplifier le processus :

// Generate OTP using secret key  
Authenticator authenticator = new Authenticator();  
String otp = authenticator.getTOTPCode(System.getenv("2FA_SECRET_KEY"));

Conseils pour gagner en rapidité et en efficacité

Pour améliorer les performances et réduire le temps d’exécution, envisagez ces stratégies :

  • Gestion des ressources: Désactivez les fonctionnalités inutiles pour économiser de la mémoire et accélérer l'exécution.
ChromeOptions options = new ChromeOptions();  
options.addArguments("--disable-gpu");  
options.addArguments("--disable-dev-shm-usage");  
options.addArguments("--no-sandbox");
  • Gestion du contenu AJAX:Utilisez des attentes explicites pour garantir que les éléments dynamiques sont entièrement chargés avant d'interagir avec eux.
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));  
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("dynamic-content")));
  • Exécution parallèle:Exécutez des tests simultanément pour gagner du temps.
@Test(threadPoolSize = 3, invocationCount = 10)  
public void parallelTest() {  
  // Your test code here  
}

Pour les applications lourdes en JavaScript, Unité HTML offre une alternative plus rapide à l'émulation complète du navigateur. Les tests montrent que HtmlUnit peut traiter des tâches jusqu'à 60 % plus rapidement que Chrome headless pour les tâches de scraping Web de base.

Ces méthodes avancées non seulement élargissent ce que vous pouvez accomplir, mais vous aident également à travailler plus efficacement.

Guide de résolution de problèmes

Problèmes courants et correctifs

Voici comment relever les défis d’automatisation fréquents avec des attentes explicites et des paramètres de navigateur appropriés.

Problèmes d'interaction entre les éléments

Rencontre ElementClickInterceptedException? Cela se produit souvent lorsque des éléments sont masqués ou pas entièrement chargés. Corrigez ce problème en ajustant les options du navigateur et en utilisant des attentes explicites :

ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
options.addArguments("--disable-gpu");
options.addArguments("--window-size=1920,1200");
options.addArguments("--ignore-certificate-errors");

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.elementToBeClickable(By.id("target-element")));

Gestion du contenu dynamique

Pour les applications qui utilisent beaucoup JavaScript, augmentez les temps d'attente pour tenir compte des réponses AJAX. Les applications monopages, en particulier, peuvent nécessiter jusqu'à 30 secondes pour que tout le contenu soit chargé lors du rendu initial.

Stratégies de débogage

Lorsque vous travaillez sans interface visuelle en mode headless, comptez sur ces méthodes pour déboguer efficacement :

  • Capture Capture: Utilisation driver.getScreenshotAs(OutputType.FILE) pour capturer l'état actuel.
  • Analyse de la source de la page: Récupérer la source de la page avec driver.getPageSource().
  • Capture du journal de la console:Accéder aux journaux de la console du navigateur à l'aide de driver.manage().logs().get(LogType.BROWSER).

Intégrez ces outils de débogage dans votre pipeline CI/CD pour renforcer votre processus d’automatisation des tests.

Étapes d'intégration CI/CD

Une fois les problèmes courants résolus, intégrez vos tests headless dans un workflow CI/CD pour des contrôles de qualité transparents.

Configuration de l'environnement

Configurez votre environnement de test avec des paramètres Chrome optimisés :

ChromeOptions options = new ChromeOptions();
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));

Stratégie d'exécution des tests

Exécutez des tests parallèles pour améliorer l'efficacité :

@Test(threadPoolSize = 3, invocationCount = 10)
public void parallelTests() {
    ThreadLocal<WebDriver> driver = new ThreadLocal<>();
    driver.set(new ChromeDriver(options));
    try {
        // Test implementation
    } finally {
        driver.get().quit();
    }
}

Gestion des ressources

Prévenez les fuites de mémoire en assurant un nettoyage approprié après chaque test :

@AfterMethod
public void cleanup() {
    if (driver != null) {
        driver.quit();
        driver = null;
    }
}

Ajoutez une journalisation détaillée pour un meilleur dépannage :

private static final Logger logger = LoggerFactory.getLogger(TestClass.class);

try {
    // Test execution
} catch (Exception e) {
    logger.error("Test failed: " + e.getMessage());
    File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(screenshot, new File("error-" + System.currentTimeMillis() + ".png"));
    throw e;
}

Ces étapes vous aideront à créer un cadre d’automatisation des tests fiable et efficace.

Pour aller plus loin

Résumé

Les navigateurs headless ont révolutionné les tests Java en réduisant les coûts d'infrastructure de 40 % et en réduisant le temps de test de 3 jours à seulement 8 heures. Leur combinaison de rapidité, d'efficacité et de fiabilité en a fait un élément clé des flux de travail de développement modernes.

Voici quelques avantages remarquables :

  • Performance: Fonctionne 2 à 15 fois plus rapidement que les navigateurs traditionnels.
  • Efficacité des ressources:Utilise moins de mémoire et de CPU, permettant des tests parallèles.
  • Intégration CI/CD:Identifie 15 % de bugs supplémentaires avant le déploiement en production.

Si vous souhaitez approfondir votre compréhension, consultez les ressources ci-dessous.

Ressources additionnelles

Améliorez vos connaissances avec ces outils et guides utiles :

Documentation officielle

  • Documentation Selenium WebDriver – Guides d’automatisation du navigateur étape par étape.
  • Guide de l’utilisateur HtmlUnit – Utilisation détaillée de l’API et exemples.
  • Protocole Chrome DevTools – Informations sur les fonctionnalités de Chrome sans tête.

Outils et bibliothèques avancés

  • pilote chromé non détecté – Aide à contourner la détection des robots.
  • sélénium-furtif – Permet une manipulation sophistiquée des empreintes digitales.
  • gestionnaire de pilotes Web – Simplifie l’automatisation de la gestion des conducteurs.

Une success story qui mérite d'être mentionnée est celle d'une start-up fintech qui a adopté Puppeteer pour l'automatisation de ses tests. Leurs résultats ? Une augmentation de 60 % de la couverture des tests et une réduction massive du temps de test, de 3 jours à seulement 8 heures par version.

Selenium WebDriver et HtmlUnit offrent tous deux des options fiables et évolutives pour l'automatisation Java. Avec les modes headless natifs désormais disponibles dans Chrome (depuis la version 59) et Firefox (depuis la version 56), la mise en place de tests automatisés et de scraping Web n'a jamais été aussi simple.

À lire également

Blogs connexes

Cas d'utilisation

Soutenu par