English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Comment manipuler les opérations de souris et de clavier en Python selenium (ActionChains)

En utilisant selenium pour l'automatisation, on peut parfois se trouver dans des situations où il est nécessaire de simuler des opérations de souris pour procéder, par exemple, cliquer, double-clic, clic droit, glisser-déposer, etc. Et selenium nous fournit une classe pour gérer de tels événements - ActionChains

selenium.webdriver.common.action_chains.ActionChains(driver)

Cette classe peut généralement répondre à tous nos besoins en opérations de souris.

1.Utilisation de base d'ActionChains

Il est nécessaire de comprendre le principe d'exécution d'ActionChains, lorsque vous appellez une méthode d'ActionChains, elle n'exécute pas immédiatement, mais conserve toutes les opérations dans une file d'attente, et lorsqu'elle appelle la méthode perform(), les éléments de la file d'attente sont exécutés en ordre.

Dans ce cas, nous avons deux méthodes d'appel possibles : 

•Écriture en chaîne

menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu"1")
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()

 •Écriture par étapes

menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu"1")
actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()

 Les deux méthodes sont essentiellement identiques, ActionChains exécute toutes les opérations en ordre.

2. liste des méthodes ActionChains

click(on_element=None) ——clic gauche de la souris

click_and_hold(on_element=None) ——clic gauche de la souris, sans relâcher

context_click(on_element=None) ——clic droit de la souris

double_click(on_element=None) ——double-clic sur le bouton gauche de la souris

drag_and_drop(source, target) ——glisser-déposer vers un élément puis relâcher

drag_and_drop_by_offset(source, xoffset, yoffset) ——glisser-déposer à un certain point puis relâcher

key_down(value, element=None) ——appuyer sur une touche du clavier

key_up(value, element=None) ——relâcher une touche

move_by_offset(xoffset, yoffset) ——déplacer la souris d'un certain point à un autre

move_to_element(to_element) ——déplacer la souris vers un élément

move_to_element_with_offset(to_element, xoffset, yoffset) ——se déplacer à une distance spécifique par rapport à un élément (coordonnées en haut à gauche)

perform() ——exécuter toutes les actions de la chaîne

release(on_element=None) ——relâcher le clic gauche de la souris à un emplacement spécifique

send_keys(*keys_to_send) ——envoyer une touche à l'élément actif

send_keys_to_element(element, *keys_to_send) ——envoyer une touche à un élément spécifique

Voici un exemple détaillé pour expliquer et démontrer l'utilisation de chaque méthode :

3. exemple de code

1. action de clic

示例网址http://sahitest.com/demo/clicks.htm

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/clicks.htm
click_btn = driver.find_element_by_xpath('//input[@value="click me"]') # 单击按钮
doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]') # 双击按钮
rightclick_btn = driver.find_element_by_xpath('//input[@value="right click me"]') # Clic droit sur le bouton
ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform() # Utilisation en chaîne
print driver.find_element_by_name('t2').get_attribute('value')
sleep(2)
driver.quit()

Résultat :

[CLICK][DOUBLE_CLICK][RIGHT_CLICK]

2.le curseur de la souris se déplace

示例网址http://sahitest.com/demo/mouseover.htm

Exemple de code :

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/mouseover.htm
write = driver.find_element_by_xpath('//input[@value="Write on hover"]') # Lorsque la souris se déplace sur cet élément, le champ input en dessous affichera 'Le curseur de la souris a bougé'
blank = driver.find_element_by_xpath('//input[@value="Blank on hover"]') # Lorsque la souris se déplace sur cet élément, le contenu du champ input en dessous sera vidé
result = driver.find_element_by_name('t1')
action = ActionChains(driver)
action.move_to_element(write).perform() # Déplacer vers write, afficher 'Le curseur de la souris a bougé'
print result.get_attribute('value')
# action.move_to_element(blank).perform()
action.move_by_offset(10, 50).perform() # Déplacer de la position actuelle(10,50) du point, avec l'effet de la phrase précédente, déplacer vers blank et vider
print result.get_attribute('value')
action.move_to_element_with_offset(blank, 10, -40).perform() # Déplacer vers l'élément blank10,-40) du point, peut être déplacé sur write
print result.get_attribute('value')
sleep(2)
driver.quit()

Résultat

Le curseur de la souris a bougé

Le curseur de la souris a bougé

3.拖拽

示例网址http://sahitest.com/demo/dragDropMooTools.htm

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/dragDropMooTools.htm')
dragger = driver.find_element_by_id('dragger') # L'élément glissant
item1 = driver.find_element_by_xpath('//div[text()="Item 1]') # 目标元素1
item2 = driver.find_element_by_xpath('//div[text()="Item 2]') # 目标2
item3 = driver.find_element_by_xpath('//div[text()="Item 3]') # 目标3
item4 = driver.find_element_by_xpath('//div[text()="Item 4]') # 目标4
action = ActionChains(driver)
action.drag_and_drop(dragger, item1).perform() # 1).移动dragger到目标1
sleep(2)
action.click_and_hold(dragger).release(item2).perform() # 2).效果与上句相同,也能起到移动效果
sleep(2)
action.click_and_hold(dragger).move_to_element(item3).release().perform() # 3).效果与上两句相同,也能起到移动的效果
sleep(2)
# action.drag_and_drop_by_offset(dragger, 400, 150).perform() # 4).移动到指定坐标
action.click_and_hold(dragger).move_by_offset(400, 150).release().perform() # 5).与上一句相同,移动到指定坐标
sleep(2)
driver.quit()

Résultat :

dropped dropped dropped dropped

一般用坐标定位很少,用上例中的方法1足够了,如果看源码,会发现方法2其实就是方法1中的drag_and_drop()的实现。注意:拖拽使用时注意加等待时间,有时会因为速度太快而失败。

4.按键

模拟按键有多种方法,能用win32api来实现,能用SendKeys来实现,也可以用selenium的WebElement对象的send_keys()方法来实现,这里ActionChains类也提供了几个模拟按键的方法。

示例网址http://sahitest.com/demo/keypress.htm

代码1:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/keypress.htm')
key_up_radio = driver.find_element_by_id('r1') # 监测按键升起
key_down_radio = driver.find_element_by_id('r2') # 监测按键按下
key_press_radio = driver.find_element_by_id('r3') # 监测按键按下升起
enter = driver.find_elements_by_xpath('//form[@name="f1"]/input')[1] # 输入框
result = driver.find_elements_by_xpath('//form[@name="f1"]/input')[0] # 监测结果
# 监测key_down
key_down_radio.click()
ActionChains(driver).key_down(Keys.CONTROL, enter).key_up(Keys.CONTROL).perform()
print result.get_attribute('value')
# 监测key_up
key_up_radio.click()
enter.click()
ActionChains(driver).key_down(Keys.SHIFT).key_up(Keys.SHIFT).perform()
print result.get_attribute('value')
# 监测key_press
key_press_radio.click()
enter.click()
ActionChains(driver).send_keys('a').perform()
print result.get_attribute('value')
driver.quit()

Résultat :

key downed charCode=[0] keyCode=[17] CTRL
key upped charCode=[0] keyCode=[16] NONE
key pressed charCode=[97] keyCode=[0] NONE

示例2:

示例网址http://sahitest.com/demo/label.htm

代码:

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from time import sleep
driver = webdriver.Firefox()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/label.htm')
input1 = driver.find_elements_by_tag_name('input')[3]
input2 = driver.find_elements_by_tag_name('input')[4]
action = ActionChains(driver)
input1.click()
action.send_keys('Test Keys').perform()
action.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform() # ctrl+a
action.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform() # ctrl+c
action.key_down(Keys.CONTROL, input2).send_keys('v').key_up(Keys.CONTROL).perform() # ctrl+v
print input1.get_attribute('value')
print input2.get_attribute('value')
driver.quit()

Résultat :

Test Keys
Test Keys

La copie et le collage peuvent également être réalisés avec WebElement<input>.send_keys(). Vous pouvez l'essayer, ou utiliser une méthode plus basique, qui est également une méthode de traitement des fenêtres contextuelles OS, win32API, si vous êtes intéressé, vous pouvez également essayer SendKeys, keybd_event

Voici la totalité du contenu de cet article, j'espère qu'il vous aidera dans vos études, et j'espère que vous soutiendrez également le tutoriel de cri.

Déclaration : le contenu de cet article est tiré d'Internet, propriété des auteurs respectifs, contribué et téléchargé par les utilisateurs d'Internet, ce site n'en possède pas la propriété, n'a pas été édité par l'homme, ni assume la responsabilité juridique. Si vous trouvez du contenu présumé enfreindre les droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (au moment de l'envoi d'un e-mail, veuillez remplacer # par @ pour signaler une violation et fournir des preuves. Une fois confirmé, ce site supprimera immédiatement le contenu présumé enfreindre les droits d'auteur.)

Vous pourriez aussi aimer