Événements de souris avec Selenium WebDriver
Dans Selenium WebDriver, les opérations liées à la souris sont encapsulées dans la classe ActionChains. Cette classe fournit des méthodes pour simuler des actions de souris, telles que des clics, des déplacements et des glisser-déposer.
Voici un tableau récapitulatif des méthodes disponibles dans ActionChains :
| Méthode | Description |
|---|---|
| click(on_element=None) | Clic gauche de la souris |
| click_and_hold(on_element=None) | Maintien du clic gauche sans relâcher |
| context_click(on_element=None) | Clic droit de la souris |
| double_click(on_element=None) | Double-clic gauche |
| drag_and_drop(source, target) | Glisser-déposer d'un élément source vers une cible |
| drag_and_drop_by_offset(source, xoffset, yoffset) | Glisser-déposer vers des coordonnées relatives |
| move_by_offset(xoffset, yoffset) | Déplacer la souris vers des coordonnées absolues |
| move_to_element(to_element) | Déplacer la souris vers un élément spécifié |
| move_to_element_with_offset(to_element, xoffset, yoffset) | Déplacer la souris à une distance relative d'un élément |
| pause(seconds) | Introduire une pause dans la séquence d'actions |
| release(on_element=None) | Relâcher le clic gauche sur un élément |
| send_keys(*keys_to_send) | Envoyer des entrées clavier à l'élément actif |
| send_keys_to_element(element, *keys_to_send) | Envoyer des entrées clavier à un élément ciblé |
| perform() | Exécuter toutes les actions en attente |
| reset_actions() | Réinitialiser la file d'attente des actions |
Clics simples, double-clics et clics droits
Examinons comment effectuer des clics basiques avec ActionChains.
"""
Exemple de clics avec ActionChains
Site de test : http://sahitest.com/demo/clicks.htm
"""
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
# Initialisation du pilote
pilote = webdriver.Chrome()
try:
pilote.get('http://sahitest.com/demo/clicks.htm')
# Effectuer un clic gauche
sleep(2)
element_cible1 = pilote.find_element_by_xpath('/html/body/form/input[3]')
ActionChains(pilote).click(element_cible1).perform()
# Effectuer un double-clic
sleep(2)
element_cible2 = pilote.find_element_by_xpath('/html/body/form/input[2]')
ActionChains(pilote).double_click(element_cible2).perform()
# Effectuer un clic droit
sleep(2)
element_cible3 = pilote.find_element_by_xpath('/html/body/form/input[4]')
ActionChains(pilote).context_click(element_cible3).perform()
finally:
sleep(5)
pilote.quit()
Glisser-déposer
Le glisser-déposer implique de maintenir le clic gauche, de déplacer la souris vers un élément cible, puis de relâcher.
Exemple avec jQuery UI :
"""
Glisser-déposer sur jQuery UI
Lien : https://jqueryui.com/droppable/
"""
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
# Configuration
nav = webdriver.Chrome()
nav.get('https://jqueryui.com/droppable/')
time.sleep(3)
# Gérer l'iframe
cadre = nav.find_element_by_tag_name('iframe')
nav.switch_to.frame(cadre)
# Identifier les éléments
depart = nav.find_element_by_id('draggable')
arrivee = nav.find_element_by_id('droppable')
# Réaliser le glisser-déposer
ActionChains(nav).drag_and_drop(depart, arrivee).perform()
time.sleep(5)
nav.quit()
Un autre exemple pour un puzzle interactif :
"""
Glisser-déposer pour un jeu de puzzle
URL : http://www.jq22.com/demo/pintu20151229/
"""
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
navigateur = webdriver.Chrome()
navigateur.get('http://www.jq22.com/demo/pintu20151229/')
# Démarrer le jeu
time.sleep(1)
bouton_debut = navigateur.find_element_by_id('start')
ActionChains(navigateur).move_to_element(bouton_debut).click().perform()
# Exécuter le glisser-déposer
time.sleep(2)
piece_source = navigateur.find_element_by_xpath('//*[@id="container"]/div[18]')
piece_dest = navigateur.find_element_by_xpath('//*[@id="container"]/div[18]')
ActionChains(navigateur).move_to_element(piece_source).drag_and_drop(piece_source, piece_dest).perform()
time.sleep(3)
navigateur.quit()
Survol de la souris
Le survol déclenche des événements en déplaçant la souris au-dessus d'un élément, comme le changement d'apparence d'un lien.
"""
Survol d'un lien hypertexte
"""
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
conducteur = webdriver.Chrome()
conducteur.get('https://www.cnblogs.com/neeo')
time.sleep(3)
cible = conducteur.find_elements_by_class_name('postTitle2')[0]
# Survoler l'élément
ActionChains(conducteur).move_to_element(cible).perform()
# Cliquer après survol
time.sleep(2)
ActionChains(conducteur).move_to_element(cible).click().perform()
time.sleep(5)
conducteur.quit()
Exemple d'interaction avec le menu de Taobao :
"""
Survol d'une liste de menu sur Taobao
"""
import time
from selenium import webdriver
from selenium.webdriver import ActionChains as AC
explorateur = webdriver.Chrome()
explorateur.get('https://www.taobao.com/')
# Parcourir les menus du marché
menus = explorateur.find_elements_by_class_name('J_Cat')
print(f"Nombre de menus trouvés : {len(menus)}")
for m in menus:
AC(explorateur).move_to_element(m).perform()
time.sleep(0.5)
# Survoler un menu spécifique et cliquer sur un sous-élément
time.sleep(2)
AC(explorateur).move_to_element(menus[0]).perform()
time.sleep(2)
sous_element = explorateur.find_element_by_xpath('/html/body/div[4]/div[1]/div[1]/div[1]/div/div/div[1]/div[1]/div[1]/p/a[1]')
print(sous_element.text)
sous_element.click()
time.sleep(6)
explorateur.quit()
Vérification par glissement
Pour des exemples avancés de vérification par glissement, consultez cet article technqiue : Vérification par glissement avec Selenium.