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

Guida all'uso delle operazioni del mouse e della tastiera in Python selenium (ActionChains)

Quando si utilizza Selenium per l'automazione, a volte si incontrano situazioni in cui è necessario simulare operazioni del mouse per procedere, come fare clic, doppio clic, clic destro del mouse, trascinamento, ecc. E Selenium ci fornisce una classe per gestire questo tipo di eventi - ActionChains

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

Questa classe può基本上满足我们对鼠标操作的所有需求。

1.Uso di base di ActionChains

Prima di tutto, è necessario comprendere il principio di esecuzione di ActionChains, quando si chiama un metodo di ActionChains, non viene eseguito immediatamente, ma tutte le operazioni vengono memorizzate in una coda in ordine, e quando si chiama il metodo perform(), le operazioni nella coda vengono eseguite una dopo l'altra.

In questo caso possiamo avere due metodi di chiamata: 

•Scrittura a catena

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()

 •Scrittura a passi

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()

 Entrambe le scritture sono essenzialmente le stesse, ActionChains eseguirà tutte le operazioni in sequenza.

2. Elenco dei metodi di ActionChains

click(on_element=None) - clic del pulsante sinistro del mouse

click_and_hold(on_element=None) - clic del pulsante sinistro del mouse e non rilasciare

context_click(on_element=None) - clic del pulsante destro del mouse

double_click(on_element=None) - doppio clic sul pulsante sinistro del mouse

drag_and_drop(source, target) - trascina a un elemento e rilascia

drag_and_drop_by_offset(source, xoffset, yoffset) - trascina a una coordinata e rilascia

key_down(value, element=None) - preme una chiave sulla tastiera

key_up(value, element=None) - rilascia una chiave

move_by_offset(xoffset, yoffset) - muovi il mouse dalla posizione corrente a una certa coordinata

move_to_element(to_element) - muovi il mouse a un elemento

move_to_element_with_offset(to_element, xoffset, yoffset) - muovi a una posizione distante di una certa distanza dall'angolo superiore sinistro di un elemento

perform() - esegui tutte le azioni nella catena

release(on_element=None) - rilascia il pulsante sinistro del mouse su una posizione di elemento

send_keys(*keys_to_send) - invia una chiave a l'elemento attivo corrente

send_keys_to_element(element, *keys_to_send) —— Invia una chiave a un elemento specifico

Di seguito, utilizzando esempi, illustreremo e dimostreremo l'uso di ciascun metodo:

3. Esempio di codice

1. Operazione di clic

Indirizzo esempio 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"]') # Bottone di clic singolo
doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]') # Bottone di doppio clic
rightclick_btn = driver.find_element_by_xpath('//input[@value="right click me"]') # Bottone di clic destro
ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform() # Utilizzo a catena
print driver.find_element_by_name('t2').get_attribute('value')
sleep(2)
driver.quit()

Risultato:

[CLICK][DOUBLE_CLICK][RIGHT_CLICK]

2. Spostamento del mouse

Indirizzo esempio http://sahitest.com/demo/mouseover.htm

Esempio di codice:

# -*- 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() # Spostarsi su write, visualizzare "Mouse moved"
print result.get_attribute('value')
# action.move_to_element(blank).perform()
action.move_by_offset(10, 50).perform() # Spostarsi di 10, 50 punti rispetto alla posizione corrente, con lo stesso effetto del periodo precedente, spostarsi su blank, svuotare
print result.get_attribute('value')
action.move_to_element_with_offset(blank, 10, -40).perform() # Spostarsi al punto (10, -40) rispetto all'elemento blank, può spostarsi su write, spostarsi
print result.get_attribute('value')
sleep(2)
driver.quit()

Risultato

Mouse moved

Mouse moved

3. Trascinamento

Esempio di URL 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') # Elemento trascinato
item1 = driver.find_element_by_xpath('//div[text()="Item 1"]') # Elemento di destinazione 1
item2 = driver.find_element_by_xpath('//div[text()="Item 2"]') # Punto di destinazione 2
item3 = driver.find_element_by_xpath('//div[text()="Item 3"]') # Punto di destinazione 3
item4 = driver.find_element_by_xpath('//div[text()="Item 4"]') # Punto di destinazione 4
action = ActionChains(driver)
action.drag_and_drop(dragger, item1).perform() # 1. Spostare il dragger al punto di destinazione 1
sleep(2)
action.click_and_hold(dragger).release(item2).perform() # 2. L'effetto è lo stesso del periodo precedente, può anche avere un effetto di spostamento
sleep(2)
action.click_and_hold(dragger).move_to_element(item3).release().perform() # 3. The effect is the same as the previous two sentences, and it can also achieve the effect of moving
sleep(2)
# action.drag_and_drop_by_offset(dragger, 400, 150).perform() # 4. Move to the specified coordinates
action.click_and_hold(dragger).move_by_offset(400, 150).release().perform() # 5. Same as the previous sentence, move to the specified coordinates
sleep(2)
driver.quit()

Risultato:

dropped dropped dropped dropped

Generally, coordinate positioning is rarely used, and method 1 in the example is sufficient. If you look at the source code, you will find that method 2 is actually the implementation of drag_and_drop() in method 1. Note: When dragging, pay attention to the waiting time, as it may fail due to the speed being too fast.

4. Keystroke

There are many ways to simulate keystrokes, which can be achieved with win32api, SendKeys, or the send_keys() method of selenium's WebElement object. Here, the ActionChains class also provides several methods for simulating keystrokes.

Example URL http://sahitest.com/demo/keypress.htm

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') # Monitor key press up
key_down_radio = driver.find_element_by_id('r2') # Monitor key press down
key_press_radio = driver.find_element_by_id('r3') # Monitor key press up
enter = driver.find_elements_by_xpath('//form[@name="f1"]/input')[1] # Input box
result = driver.find_elements_by_xpath('//form[@name="f1"]/input')[0] # Monitor result
# Monitor 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()

Risultato:

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()

Risultato:

Test Keys
Test Keys

Puoi anche implementare copia incolla utilizzando WebElement< input >.send_keys(). Puoi provarlo anche, e puoi utilizzare metodi più rudimentali, come win32api, che è anche uno dei metodi di gestione delle finestre di os, puoi anche provare SendKeys e keybd_event, se hai interesse.

Questo è tutto il contenuto dell'articolo, speriamo che sia utile per la tua apprendimento e che tu sostenga fortemente il Corso di urla.

Dichiarazione: il contenuto di questo articolo è stato prelevato da Internet, è di proprietà dei rispettivi autori, il contenuto è stato contribuito e caricato dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato sottoposto a modifica manuale e non assume responsabilità legali correlate. Se trovi contenuti sospetti di violazione del copyright, ti preghiamo di inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito rimuoverà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare