Passer au contenu

Comment rechercher des éléments par XPath dans Selenium (Guide complet)

En tant qu'expert en web scraping et proxys avec plus de 5 ans d'expérience, j'ai trouvé que XPath était l'une des techniques les plus utiles et les plus polyvalentes pour localiser des éléments Web. La maîtrise des sélecteurs XPath peut vous aider à extraire avec précision les données des pages Web les plus complexes.

Dans ce guide complet de plus de 3200 XNUMX mots, je partagerai tout ce que j'ai appris sur la recherche et l'interaction avec des éléments à l'aide de XPath dans Selenium.

Qu’est-ce que XPath exactement ?

Avant de plonger dans l’utilisation, il est important de comprendre ce qu’est réellement XPath.

XPath signifie XML Path Language. Il s'agit d'un langage de requête permettant de sélectionner des nœuds à partir d'un document XML. Essentiellement, XPath fournit une syntaxe pour décrire des parties d'une structure XML.

Étant donné que HTML est structuré comme XML, avec des éléments imbriqués comme des balises d'ouverture et de fermeture, XPath peut également être utilisé pour cibler des parties d'un document HTML.

Selon w3schools, quelques faits clés sur XPath :

  • XPath utilise des expressions de chemin pour sélectionner des nœuds ou des ensembles de nœuds dans un document XML
  • Ces expressions de chemin ressemblent beaucoup aux expressions de chemin que vous voyez lorsque vous travaillez avec un système de fichiers informatique traditionnel.
  • XPath contient plus de 100 fonctions intégrées pour manipuler des chaînes, des nombres, des booléens, des ensembles de nœuds, etc.
  • XPath est un élément majeur du XSLT (Extensible Stylesheet Language Transformations)

En résumé, XPath est un puissant langage d'interrogation et d'extraction conçu pour naviguer dans les documents XML.

Quel est le lien entre XPath et Sélénium ?

Selenium est un framework d'automatisation pour contrôler les navigateurs Web. Lorsque vous chargez une page Web dans Selenium, le contenu HTML est analysé dans une structure DOM (Document Object Model).

Le DOM représente visuellement la page sous la forme d'une arborescence d'éléments HTML imbriqués.

XPath peut être utilisé pour parcourir le DOM afin de rechercher et d'interagir avec des éléments spécifiques de la page.

Par exemple, considérons ce HTML simplifié :

<html>
<body>

  <div>
    <p>Hello World!</p>
  </div>

  <div>
    <img src="logo.png"/>
  </div>

</body>
</html>

Le DOM pourrait ressembler à ceci :

       html
       /  \
     body   
     / \     
    div  div
      |    |
     p    img

Vous pouvez ensuite utiliser des expressions XPath pour interroger des éléments au sein de cette structure :

/html/body/div[1]/p
//div/img

Cela rend XPath incroyablement utile pour automatiser des actions sur des parties spécifiques d'une page avec Selenium.

Bases de la syntaxe XPath

Maintenant que vous comprenez le rôle de XPath, examinons la syntaxe.

XPath utilise des expressions de chemin pour sélectionner des éléments et des attributs dans un document XML. Les expressions ressemblent beaucoup aux chemins d'un système de fichiers comme sur votre ordinateur :

/Users/jsmith/Documents/letter.docx

La barre oblique / permet de parcourir les dossiers imbriqués.

Quelques modèles XPath de base :

  • nodename – Sélectionne tous les nœuds portant le nom nodename
  • / – Sélectionne à partir du nœud racine
  • // – Sélectionne les nœuds à n’importe quelle profondeur
  • . – Sélectionne le nœud actuel
  • .. – Sélectionne le nœud parent
  • @ – Sélectionne les attributs

Par exemple :

/html/body/div - Selects all div tags under body
//div - Selects all div tags anywhere 
div[@class=‘header‘] - Selects div tags with matching class attribute

Il existe de nombreuses syntaxes plus spécialisées que nous aborderons tout au long de ce guide. Mais ces modèles de base vous permettent de commencer à créer des sélecteurs XPath ciblés.

D'après mon expérience, maîtriser seulement 5 à 10 expressions XPath fondamentales vous permettra de localiser des éléments sur la majorité des sites Web.

Rechercher des éléments Web avec find_element ainsi que find_elements

Selenium fournit deux méthodes principales pour localiser des éléments à l'aide de XPath :

  • find_element() – Renvoie un seul WebElement correspondant au XPath
  • find_elements() – Renvoie une liste de tous les WebElements correspondants

Voici un exemple d'utilisation simple :

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# Find single element
element = driver.find_element(By.XPATH, ‘//img‘) 

# Find multiple elements 
elements = driver.find_elements(By.XPATH, ‘//div‘)

Avec ces deux méthodes, vous pouvez commencer à tirer parti de la puissance de XPath pour interagir de manière automatisée avec des parties spécifiques d’une page Web.

Conseils pour trouver des éléments

Sur la base de mes années d'expérience, voici quelques conseils clés lors de la construction de sélecteurs XPath :

  • Inspecter la source HTML – L'affichage du contenu HTML brut vous permet d'identifier des attributs et des modèles uniques pour cibler les éléments. Tous les navigateurs modernes disposent d'outils de développement pour afficher la source.

  • Copier XPath dans le navigateur – La plupart des outils de développement de navigateur incluent également des fonctionnalités permettant de copier le XPath complet d'un élément. Vous pouvez ensuite modifier et simplifier ces sélecteurs de base.

  • Focus sur l'identité – L'attribut id d'un élément de page fournit le sélecteur le plus direct et unique comme //input[@id=‘search‘].

  • Aide aux cours – Les attributs de classe permettent des requêtes plus flexibles comme //div[@class=‘results‘] même s'il n'est pas complètement unique.

  • Évitez les index – Le fait de s'appuyer sur des index de position comme [1], [2] conduit à des localisateurs fragiles.

  • Plus c'est court, mieux c'est – Un XPath concis avec un minimum d'étapes imbriquées permet d'éviter les requêtes lentes ou les correspondances incorrectes.

La maîtrise de ces directives vous aidera à créer des sélecteurs XPath robustes qui ciblent avec élégance les éléments de page requis.

Modèles et recettes XPath courants

Puisque vous comprenez maintenant les bases, examinons quelques exemples courants de modèles XPath :

Sélectionner par valeur d'attribut

//input[@type=‘submit‘]
//a[@href=‘contact.html‘]

Correspondance d'attribut partielle

//input[contains(@name, ‘search‘)]
//div[starts-with(@class, ‘result‘)]

Sélectionnez la correspondance du texte

//p[text()=‘Hello World‘] 
//h2[contains(text(), ‘Welcome‘)]

Sélectionnez les enfants

/div/p
//tbody/tr/td

Sélection indexée

(//input[@type=‘button‘])[2]

Sélection chaînée

//div[@id=‘nav‘]/ul/li/a 

Suivre des frères et sœurs

//h1[text()=‘Articles‘]/following-sibling::p

Je recommande de se familiariser avec chacune de ces techniques courantes. Ils forment une boîte à outils de compétences XPath qui vous seront très utiles lors de la création de requêtes robustes.

Exemple de grattage

Passons en revue un exemple de script de scraping Web utilisant Selenium et XPath en Python.

Nous extrairons les données produit d'un site de commerce électronique :

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# Initialize driver 
driver = webdriver.Chrome(‘/path/to/chromedriver‘)

# Load page
driver.get(‘https://www.example.com‘)

# Click shop link
shop_link = driver.find_element(By.LINK_TEXT, ‘Shop‘)
shop_link.click()

# Wait for new page to load
time.sleep(5)  

# Extract product details
product = driver.find_element(By.XPATH, ‘//div[@class="product"][1]‘)
name = product.find_element(By.XPATH, ‘.//h2‘).text
description = product.find_element(By.XPATH, ‘.//p‘).text 
price = product.find_element(By.XPATH, ‘.//span[@class="price"]‘).text

print(name, description, price)

# Close browser
driver.quit()

Cela montre comment XPath peut être utilisé pour cibler avec précision des éléments afin de récupérer les données de pages imbriquées.

Problèmes courants et solutions

Voici quelques problèmes courants pouvant survenir lors de l’utilisation des localisateurs XPath dans Selenium, ainsi que des stratégies d’atténuation :

Délais d'attente

Si les pages mettent du temps à se charger, utilisez des attentes implicites et explicites :

from selenium.webdriver.common.by import WebDriverWait 

driver.implicitly_wait(10) 

WebDriverWait(driver, 20).until(expected_conditions)

Éléments obsolètes

Si le DOM change, déplacez les éléments pour éviter les exceptions d'éléments obsolètes :

elements = driver.find_elements(By.XPATH, ‘//div‘)
# DOM updates, elements now stale
elements = driver.find_elements(By.XPATH, ‘//div‘) 

Compatibilité du navigateur

Certaines fonctionnalités avancées de XPath peuvent ne pas fonctionner sur tous les navigateurs. Testez le comportement et simplifiez si nécessaire.

Ralentissement des performances

Les expressions XPath très complexes peuvent ralentir l'exécution des tests. Simplifiez la structure lorsque cela est possible.

Visibilité

Les éléments correspondants ne sont pas nécessairement visibles. Assurez-vous qu’ils sont affichés avant d’interagir.

L’expérience aide à anticiper ces problèmes : ils deviennent beaucoup plus faciles à gérer avec le temps.

Alternatives XPath

Bien que XPath soit puissant, ce n’est pas toujours la meilleure solution. Voici quelques alternatives courantes :

Sélecteurs CSS

Les sélecteurs CSS offrent un moyen simple et familier de rechercher des éléments :

driver.find_element(By.CSS_SELECTOR, ‘input[type="submit"]‘)
driver.find_element(By.CSS_SELECTOR, ‘.search-box‘) 

Attributs ID et Nom

Si les identifiants ou les noms sont vraiment uniques, utilisez :

driver.find_element(By.ID, ‘search‘)
driver.find_element(By.NAME, ‘query‘) 

link Text

Faire correspondre le texte complet du lien peut éviter les requêtes complexes :

driver.find_element(By.LINK_TEXT, ‘Logout‘)

Évaluez chaque option en fonction de vos besoins spécifiques. Je trouve souvent qu'une combinaison de localisateurs de texte XPath, CSS, ID et de lien offre une robustesse maximale.

Comparaison des stratégies de localisation

Voici une comparaison de XPath avec certaines stratégies alternatives courantes de localisation d'éléments :

Method ExempleAvantagesInconvénients
XPath//div/pRequêtes très flexiblesSyntaxe complexe
Sélecteur CSSdiv.résultats pSyntaxe familièreCible uniquement la classe/l'identifiant/les attributs
ID#formulaire-d'inscriptionTrès rapide et uniqueNécessite des identifiants
Nomnom = requêteUniqueS'appuyer sur les conventions de dénomination
Texte de lienDéconnexionSimple pour les liensUniquement pour le texte du lien

Comme vous pouvez le constater, chaque stratégie comporte des compromis. L'utilisation de XPath avec des sélecteurs et des attributs CSS peut fournir une flexibilité de localisateur robuste.

Utilisation avancée avec lxml et parsel

Bien que Selenium dispose de méthodes de recherche intégrées très pratiques, des bibliothèques d'analyse dédiées telles que lxml et parsel offrent une puissance supplémentaire pour les tâches de scraping complexes.

Ces bibliothèques offrent une prise en charge robuste de XPath ainsi que de nombreuses autres fonctionnalités telles que :

  • Analyseurs HTML et XML rapides
  • Prise en charge de XPath 1.0 et 2.0+
  • Une large gamme de fonctions et d'opérateurs XPath
  • Liaisons pratiques pour analyser le HTML
  • Intégration avec des frameworks populaires comme Scrapy

Quelques exemples d'utilisation :

from lxml import html

tree = html.parse(‘page.html‘)
p_elements = tree.xpath(‘//p‘)

from parsel import Selector
sel = Selector(text=html_text)
links = sel.xpath(‘//a/@href‘).getall() 

Pour les travaux de scraping plus lourds, j'utilise souvent ces bibliothèques pour compléter les capacités intégrées de Selenium.

Conclusion et leçons clés

La recherche d'éléments par XPath est une technique essentielle pour toute personne utilisant Selenium pour l'automatisation de tests ou le web scraping.

Voici quelques leçons clés que j'ai apprises au cours de plus de 5 années d'utilisation de XPath pour interagir avec des sites complexes :

  • Commencez par apprendre quelques modèles XPath de base tels que la correspondance d'attributs, la sélection de texte, la sélection d'enfants, etc. La plupart des utilisations s'appuient sur ces principes fondamentaux.

  • Trouver un équilibre entre des requêtes concises mais uniques demande de la pratique. C'est un art autant qu'une science.

  • Familiarisez-vous avec les outils de développement de navigateurs pour inspecter la source et copier les chaînes XPath initiales.

  • Complétez XPath avec des sélecteurs CSS et des attributs id/name, le cas échéant. La combinaison des approches conduit à une robustesse maximale.

  • Envisagez des bibliothèques d'analyse XPath avancées telles que lxml et parsel pour une capacité de scraping améliorée au-delà de Selenium.

  • Apprenez à anticiper et à gérer les problèmes courants tels que les éléments obsolètes et les délais d'attente au fil du temps grâce à l'expérience.

J'espère que ce guide a fourni une référence complète pour libérer la puissance de la sélection d'éléments XPath avec Selenium. Faites-moi savoir si vous avez d'autres questions spécifiques !

Mots clés:

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *