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