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