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