Maison > Article > développement back-end > Jouez avec les opérations de la souris et du clavier Python Selenium (ActionChains)
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 !