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

Manipulación de ratón y teclado en Python selenium (ActionChains)

Al hacer automatización con selenium, a veces nos encontramos con situaciones que necesitan simular operaciones de ratón para proceder, como hacer clic, hacer doble clic, hacer clic con el botón derecho del ratón, arrastrar y soltar, etc. Selenium nos proporciona una clase para manejar este tipo de eventos: ActionChains

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

Esta clase puede satisfacer básicamente todas nuestras necesidades de operaciones de ratón.

1.Uso básico de ActionChains

Primero, es necesario entender el principio de ejecución de ActionChains, cuando llama a un método de ActionChains, no se ejecutará inmediatamente, sino que todas las operaciones se almacenarán en una cola en orden, y cuando llama al método perform(), los elementos de la cola se ejecutarán sucesivamente.

En este caso, podemos tener dos métodos de llamada: 

• escritura en cadena

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

 • escritura paso a paso

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

 Ambas formas de escritura son esencialesmente iguales, ActionChains ejecutará todas las operaciones en orden.

2. lista de métodos de ActionChains

click(on_element=None) ——hacer clic en el botón izquierdo del ratón

click_and_hold(on_element=None) ——hacer clic en el botón izquierdo del ratón y no soltar

context_click(on_element=None) ——hacer clic con el botón derecho del ratón

double_click(on_element=None) ——hacer doble clic en el botón izquierdo del ratón

drag_and_drop(source, target) ——arrastrar y soltar a un elemento específico

drag_and_drop_by_offset(source, xoffset, yoffset) ——arrastrar y soltar en una coordenada específica

key_down(value, element=None) ——presionar una tecla del teclado

key_up(value, element=None) ——soltar una tecla

move_by_offset(xoffset, yoffset) ——mover el ratón desde la posición actual a una coordenada

move_to_element(to_element) ——mover el ratón a un elemento

move_to_element_with_offset(to_element, xoffset, yoffset) ——moverse a una posición específica a una distancia de un elemento (coordenadas superior izquierda)

perform() ——ejecutar todas las acciones en la cadena

release(on_element=None) ——soltar el botón izquierdo del ratón en una posición específica

send_keys(*keys_to_send) ——enviar una tecla al elemento con el foco actual

send_keys_to_element(element, *keys_to_send) ——enviar una tecla a un elemento especifico

A continuación, utilizaremos ejemplos para explicar y demostrar el uso de cada método en detalle:

3. ejemplo de código

1. operación 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"]') # hacer clic en el botón
doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]') # hacer doble clic en el botón
rightclick_btn = driver.find_element_by_xpath('//input[@value="Haga clic con el botón derecho aquí"]') # Haga clic derecho en el botón
ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform() # Uso en cadena
print driver.find_element_by_name('t2').get_attribute('value')
sleep(2)
driver.quit()

Resultados:

[CLICK][DOUBLE_CLICK][RIGHT_CLICK]

2.movimiento del ratón

示例网址http://sahitest.com/demo/mouseover.htm

Ejemplo de código:

# -*- 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="Escribir al pasar el ratón"]') # Al pasar el ratón sobre este elemento, se mostrará 'Movimiento del ratón' en el cuadro de entrada inferior
blank = driver.find_element_by_xpath('//input[@value="Borrar al pasar el ratón"]') # Al pasar el ratón sobre este elemento, se borrará el contenido del cuadro de entrada inferior
result = driver.find_element_by_name('t1')
action = ActionChains(driver)
action.move_to_element(write).perform() # Moverse a write, mostrar 'Movimiento del ratón'
print result.get_attribute('value')
# action.move_to_element(blank).perform()
action.move_by_offset(10, 50).perform() # Moverse a la distancia desde la posición actual(10,50) del punto, con el mismo efecto que la frase anterior, moverse a blank y borrar
print result.get_attribute('value')
action.move_to_element_with_offset(blank, 10, -40).perform() # Moverse a la distancia del elemento blank10,-40) del punto, se puede mover a write
print result.get_attribute('value')
sleep(2)
driver.quit()

Resultado

Movimiento del ratón

Movimiento del ratón

3.arrastrar

示例网址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 arrastrable
item1 = driver.find_element_by_xpath('//div[text()="Item 1"]') # Elemento objetivo1
item2 = driver.find_element_by_xpath('//div[text()="Item 2"]') # Objetivo2
item3 = driver.find_element_by_xpath('//div[text()="Item 3"]') # Objetivo3
item4 = driver.find_element_by_xpath('//div[text()="Item 4"]') # Objetivo4
action = ActionChains(driver)
action.drag_and_drop(dragger, item1).realizar() # 1).mover_dragger_al_objetivo1
sleep(2)
action.click_and_hold(dragger).liberar(item2).realizar() # 2).efecto es el mismo que la línea anterior, también puede tener el efecto de mover
sleep(2)
action.click_and_hold(dragger).mover_a_elemento(item3 3).liberar().realizar() #
sleep(2)
.efecto es el mismo que las dos líneas anteriores, también puede tener el efecto de mover 4).mover_a_coordenada_específica().realizar() # 15 4).mover_a_coordenada_específica().realizar() #
# action.drag_and_drop_by_offset(dragger,4).mover_a_coordenada_específica().realizar() # 1500, 5).mover_a_coordenada_específica().liberar().realizar() #
sleep(2)
driver.quit()

Resultados:

soltado soltado soltado soltado

generalmente se usa poco para la ubicación de coordenadas, se usa el método1suficiente, si miras el código fuente, notarás que el método2es básicamente el método1la implementación de drag_and_drop(). Nota: al usar el arrastrar y soltar, asegúrate de agregar tiempo de espera, ya que a veces puede fallar debido a la velocidad demasiado rápida.

4.pulsación

Hay varios métodos para simular pulsaciones de teclas, se puede usar win32se puede implementar con SendKeys, también se puede implementar con el método send_keys() del objeto WebElement de selenium, y aquí la clase ActionChains también proporciona varios métodos de simulación de pulsación de teclas.

示例网址http://sahitest.com/demo/keypress.htm

código1:

# -*- 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') # Monitoreo de elevación de tecla
key_down_radio = driver.find_element_by_id('r2') # Monitoreo de pulsación de tecla
key_press_radio = driver.find_element_by_id('r3') # Monitoreo de pulsación de tecla subiendo
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()

Resultados:

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('Teclas de prueba').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
imprimir input1.get_attribute('value')
imprimir input2.get_attribute('value')
driver.quit()

Resultados:

Teclas de prueba
Teclas de prueba

La copia y pegada también se puede implementar utilizando WebElement<input>.send_keys(), puede probarlo, también puede usar métodos más básicos, que también son una de las formas de manejar la ventana de os32api, también puede probar SendKeys, keybd_event si tiene interés

Esto es todo el contenido del artículo, espero que ayude a su aprendizaje y que todos lo apoyen a gritar tutorial.

Declaración: El contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha editado artificialmente y no asume la responsabilidad de las responsabilidades legales relacionadas. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @ para denunciar y proporcione evidencia. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.)

Te gustará también