Maison >développement back-end >Tutoriel Python >Jouez avec les opérations de la souris et du clavier Python Selenium (ActionChains)

Jouez avec les opérations de la souris et du clavier Python Selenium (ActionChains)

高洛峰
高洛峰original
2017-02-22 17:19:452984parcourir

Lorsque vous utilisez Selenium pour l'automatisation, vous rencontrerez parfois des situations dans lesquelles vous devrez simuler des opérations de souris, telles que cliquer, double-cliquer, cliquer avec le bouton droit, faire glisser, etc. Selenium nous fournit une classe pour gérer de tels événements - ActionChains

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

Cette classe peut essentiellement répondre à tous nos besoins en matière d'opérations de souris.

1. Utilisation de base d'ActionChains

Tout d'abord, vous devez comprendre le principe d'exécution d'ActionChains. Lorsque vous appelez la méthode d'ActionChains, ce ne sera pas le cas. exécuté immédiatement, mais toutes les opérations sont stockées dans une file d'attente dans l'ordre. Lorsque vous appelez la méthode perform(), les heures dans la file d'attente seront exécutées séquentiellement.

Dans ce cas nous pouvons avoir deux méthodes d'appel :

•Écriture en chaîne

menu = driver.find_element_by_css_selector(".nav")
hidden_submenu =  driver.find_element_by_css_selector(".nav #submenu1")

ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()

•Rédaction étape par étape

menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")

actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()

Les deux méthodes d'écriture sont essentiellement les mêmes. ActionChains effectuera toutes les opérations dans l'ordre.

2.Liste des méthodes ActionChains

click(on_element=None) - cliquez sur le bouton gauche de la souris

click_and_hold(on_element=None) ) ——Cliquez sur le bouton gauche de la souris sans le relâcher

context_click(on_element=None) ——Cliquez sur le bouton droit de la souris

double_click(on_element=None) ——Double-cliquez sur le bouton gauche de la souris

drag_and_drop(source, target) - Faites glisser vers un élément et relâchez

drag_and_drop_by_offset(source, xoffset, yoffset) - Faites glisser jusqu'à une certaine coordonnée et relâchez

key_down(value , element=None) - Appuyez sur une touche du clavier

key_up(value, element=None) - Relâchez une touche

move_by_offset(xoffset, yoffset ) ——Déplacez la souris de l'actuel positionner à une certaine coordonnée

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

move_to_element_with_offset(to_element, xoffset, yoffset) ——Déplacer à une distance

perform() - Exécuter toutes les actions de la chaîne

release(on_element=None) - Relâcher la souris à une position d'élément Touche gauche

send_keys(*keys_to_send) - Envoyer une clé à l'actuel élément ciblé

send_keys_to_element(element, *keys_to_send) - Envoyer une clé à l'élément spécifié

Les exemples suivants utilisent des exemples pour expliquer et démontrer l'utilisation de chaque méthode en détail :

3. Exemples de code

1. Opération de clic

Exemple d'URL http://www.php.cn/;

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/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"]') # 右键单击按钮


ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform() # 链式用法

print driver.find_element_by_name('t2').get_attribute('value')

sleep(2)
driver.quit()

Résultat :

[CLICK][DOUBLE_CLICK][RIGHT_CLICK]

2. Mouvement de la souris

Exemple d'URL http://www.php.cn/;

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"]') # 鼠标移动到此元素,在下面的input框中会显示“Mouse moved”
blank = driver.find_element_by_xpath('//input[@value="Blank on hover"]') # 鼠标移动到此元素,会清空下面input框中的内容

result = driver.find_element_by_name('t1')

action = ActionChains(driver)
action.move_to_element(write).perform() # 移动到write,显示“Mouse moved”
print result.get_attribute('value')

# action.move_to_element(blank).perform()
action.move_by_offset(10, 50).perform() # 移动到距离当前位置(10,50)的点,与上句效果相同,移动到blank上,清空
print result.get_attribute('value')

action.move_to_element_with_offset(blank, 10, -40).perform() # 移动到距离blank元素(10,-40)的点,可移动到write上
print result.get_attribute('value')

sleep(2)
driver.quit()

Résultats

Souris déplacée

Souris déplacée

3. Faites glisser

Exemple d'URL http://www.php.cn /;

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/dragDropMooTools.htm')

dragger = driver.find_element_by_id('dragger') # 被拖拽元素
item1 = driver.find_element_by_xpath('//p[text()="Item 1"]') # 目标元素1
item2 = driver.find_element_by_xpath('//p[text()="Item 2"]') # 目标2
item3 = driver.find_element_by_xpath('//p[text()="Item 3"]') # 目标3
item4 = driver.find_element_by_xpath('//p[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 :

lâché lâché lâché

En général, le positionnement des coordonnées est rarement utilisé. La méthode 1 dans l'exemple ci-dessus suffit. Si vous regardez le code source, vous trouverez la méthode 2. En fait, il s'agit de l'implémentation de drag_and_drop() dans la méthode 1. Remarque : Faites attention au temps d'attente lors de l'utilisation du glisser-déposer. Parfois, cela échouera car la vitesse est trop rapide.

4. Clés

Il existe de nombreuses façons de simuler les frappes au clavier, qui peuvent être implémentées à l'aide de win32api, SendKeys ou de la méthode send_keys() de l'objet WebElement de Selenium, ici la classe ActionChains en fournit également plusieurs. méthodes de simulation des pressions sur les touches.

Exemple d'URL http://www.php.cn/;

Code 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 :

touche enfoncée charCode=[0] keyCode=[17] CTRL
touche relevée charCode=[0] keyCode=[16] NONE
touche enfoncée charCode=[ 97] keyCode=[0] AUCUN

Exemple 2 :

Exemple d'URL http://www.php.cn/;

Code :

# -*- 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 des clés
Test des clés

Copier et coller à l'aide de WebElement< ( ) peut également être implémenté. Vous pouvez l'essayer, ou vous pouvez utiliser une méthode de niveau inférieur, win32api, qui est également l'un des moyens de gérer les fenêtres contextuelles du système d'exploitation. Si vous êtes intéressé, vous pouvez également essayer SendKeys, keybd_event

et ci-dessus C'est tout le contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.

Pour plus d'articles sur le jeu avec les opérations de la souris et du clavier Python Selenium (ActionChains), veuillez faire attention au site Web PHP chinois !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn