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

Mastering python selenium mouse and keyboard operations (ActionChains)

Bei der Automatisierung mit Selenium kann es vorkommen, dass man Mausoperationen simulieren muss, um bestimmte Aktionen auszuführen, wie z.B. Klicken, Doppelklicken, Rechtsklicken, Ziehen und Schieben. Selenium bietet uns eine Klasse, um solche Ereignisse zu verarbeiten - ActionChains

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

Diese Klasse kann unseren Anforderungen an Mausoperationen in der Regel gerecht werden.

1.ActionChains-Basisanwendung

Zunächst müssen wir das Ausführungsprinzip von ActionChains verstehen. Wenn du Methoden von ActionChains aufrufst, werden diese nicht sofort ausgeführt, sondern alle Operationen in einer Warteschlange in der Reihenfolge gespeichert. Wenn du die perform()-Methode aufrufst, werden die Elemente in der Warteschlange nacheinander ausgeführt.

In diesem Fall haben wir zwei Aufrufmethoden: 

• Kettenschreibweise

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

 • Schrittbasierte Schreibweise

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

 Beide Schreibweisen sind in der Hinsicht identisch, dass ActionChains alle Operationen in der Reihenfolge ausführt.

2. ActionChains 方法列表

click(on_element=None) ——单击鼠标左键

click_and_hold(on_element=None) ——点击鼠标左键,不松开

context_click(on_element=None) ——点击鼠标右键

double_click(on_element=None) ——双击鼠标左键

drag_and_drop(source, target) ——拖拽到某个元素然后松开

drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开

key_down(value, element=None) ——按下某个键盘上的键

key_up(value, element=None) ——松开某个键

move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标

move_to_element(to_element) ——鼠标移动到某个元素

move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置

perform() ——执行链中的所有动作

release(on_element=None) ——在某个元素位置松开鼠标左键

send_keys(*keys_to_send) ——向当前焦点的元素发送某个键

send_keys_to_element(element, *keys_to_send) ——向指定元素发送某个键

接下来用示例来详细说明和演示每一个方法的用法:

3. 代码示例

1. 点击操作

示例网址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="Rechtsklick mich"]') # Rechtsklick auf den Button
ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perform() # Kettensyntax
print driver.find_element_by_name('t2).get_attribute('value')
sleep(2)
driver.quit()

结果:

[KLICK][Doppelklick][Rechtsklick]

2.Mausbewegung

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

Beispielcode:

# -*- 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="Schreiben auf Bewegen"]') # Wenn die Maus auf dieses Element bewegt wird, wird "Maus bewegt sich" im darunter liegenden Input-Feld angezeigt
blank = driver.find_element_by_xpath('//input[@value="Leer auf Bewegen"]') # Wenn die Maus auf dieses Element bewegt wird, wird der Inhalt des darunter liegenden Input-Feldes geleert
result = driver.find_element_by_name('t1)
action = ActionChains(driver)
action.move_to_element(write).perform() # Verschieben auf write, "Maus bewegt sich" wird angezeigt
print result.get_attribute('value')
# action.move_to_element(blank).perform()
action.move_by_offset(10, 50).perform() # Verschieben auf Entfernung vom aktuellen Position(10,50) Punkt, gleiche Wirkung wie vorher, verschieben auf blank, leeren
print result.get_attribute('value')
action.move_to_element_with_offset(blank, 10, -40).perform() # Verschieben auf Entfernung vom blank-Element(10,-40) Punkt, kann auf write verschoben werden
print result.get_attribute('value')
sleep(2)
driver.quit()

Ergebnis

Maus bewegt sich

Maus bewegt sich

3.Verschieben

示例网址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') # Der Element, das verschoben wird
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).移动到指定坐标
.click_and_hold(dragger).move_by_offset(400, 150).release().perform() # 5).与上一句相同,移动到指定坐标
sleep(2)
driver.quit()

结果:

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

结果:

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('测试键').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
打印输入1.get_attribute('value')
打印输入2.get_attribute('value')
driver.quit()

结果:

测试键
测试键

复制粘贴可以使用 WebElement<input>.send_keys() 实现,大家可以试一下,也可以用更底层的方法,同时也是 os 弹框的处理方法之一的 win32API,有兴趣也可以试试 SendKeys、keybd_event

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

声明:本文内容来源于网络,版权归原作者所有。内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#oldtoolbag.com(在发邮件时,请将#更换为@进行举报,并提供相关证据。一经查实,本站将立即删除涉嫌侵权内容。)