python 捕捉键盘esc事件_Python+Selenium自动化测试 4. ActionChains鼠标,键盘事件

博客介绍了Python中ActionChains模块,其核心是将操作存于列表,调用perform方法依次执行。详细阐述了鼠标操作,如单击、双击、拖拽等,以及键盘操作,包括按键按下、松开、发送值等,还给出了相关API及示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ab3362014888a27fdb0b06406f786432.png

一 ActionChains介绍

源码:

00634b9fe9b296613a48c40eed1af871.png

ActionChains是一种低级别的自动化交互方法,例如鼠标移动,鼠标按钮操作,按键操作和上下文菜单交互。这对于执行更复杂的操作非常有用,例如悬停和拖放。
 
    生成用户操作。
       在ActionChains对象上调用操作方法时,
       操作存储在ActionChains对象的队列中。
       当您调用perform()时,事件将按它们的顺序触发
       排队等候。
 
    ActionChains可以用于链式::
 
        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()
 
    或者操作可以逐个排队,然后执行。::
 
        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()

1. 引入方式

from selenium.webdriver.common.action_chains import ActionChains

2. 实现原理

实际上ActionChains这个模块的实现的核心思想就是,当你调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个List里,当你调用perform()方法时,队列中的时间会依次执行

3. 基本用法

链式写法
 
ActionChains(driver).click(clk_btn).context_click(right_btn).perform()
 
分步写法
 
# 补全化action
 
actions = ActionChains(driver)
 
# 装载单击动作
 
actions.click()
 
# 装载右击动作
 
actions.context_click()
 
# 执行所有被装载的动作
 
actions.perform()

4. 举个栗子

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains  # 引入 ActionChains 类
 
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
 
# 定位到要右击的元素
right_click = driver.find_element_by_id("xxxx")
 
# 对定位到的元素执行鼠标右键操作
ActionChains(driver).context_click(right_click).perform()

1)ActionChains(driver)

调用 ActionChains() 类,将浏览器驱动 driver 作为参数传入。

2)c(right_click)

context_click() 方法用于模拟鼠标右击操作,在调用时需要指定元素定位。

3)perform()

执行所有 ActionChains 中存储的行为,可以理解为是对整个操作的提交动作。

5. API汇总

perform(self):        ---执行链中的所有动作
reset_actions(self):     ---清除存储在远端的动作
click(self, on_element=None):   ---鼠标左键单击
click_and_hold(self, on_element=None):    --鼠标左键单击,不松开
context_click(self, on_element=None):       ---鼠标右键单击
double_click(self, on_element=None):        ---鼠标左键双击
drag_and_drop(self, source, target):        ---拖拽到某个元素后松开
drag_and_drop_by_offset(self, source, xoffset, yoffset):        ---拖拽到某个坐标后松开
key_down(self, value, element=None):        ---某个键盘键被按下
key_up(self, value, element=None):          ---松开某个键
move_by_offset(self, xoffset, yoffset):     ---鼠标移动到某个坐标
move_to_element(self, to_element):          ---鼠标移动到某个元素
move_to_element_with_offset(self, to_element, xoffset, yoffset):        ---移动到距某个元素(左上角)多少的位置
release(self, on_element=None):     ---在某元素上松开鼠标
send_keys(self, *keys_to_send):     ---发送某些值到当前焦点元素
send_keys_to_element(self, element, *keys_to_send):     ---发送某些值到指定元素

​​​​​​二 鼠标操作

详细API介绍

1. perform # 执行链中的所有动作

e0765772d7be0bced13c7650cb2d7a67.png

2. reset_actions #清除存储在远端的动作

9e810301cb9b7b2190590415eba85bfc.png

3.click #鼠标左键单击

dead5669c1228b47aa46d2d8043788bc.png

栗子:

ActionChains(driver).click()


4.click_and_hold #鼠标左键单击,不松开

4dce8522a9293e9744bde00b9399927c.png

栗子:

ActionChains(driver).click_and_hold()


5.context_click #鼠标右键单击

f37ccbc47d1d94f8fa59420d93561cbf.png

​栗子:

ActionChains(driver).context_click()

6.double_click #鼠标左键双击

329f850890479ecffd53e12c38239974.png

栗子:

# 定位到要双击的元素
 
double_click = driver.find_element_by_id("xx")
 
# 对定位到的元素执行悬停操作
 
ActionChains(driver).double_click(double_click).perform()


7. drag_and_drop(source,target) # 拖拽到某个元素后松开

1bc783ee5d0458858414cd6b9bd8a689.png

看源码解释,在源元素source上按住鼠标左键,然后移动到目标元素target上释放。

  1. source:鼠标拖动的源元素。
  2. target:鼠标释放的目标元素。

栗子:

# 定位到元素的原位置
 
element = driver.find_element_by_id("xx")
 
# 定位到元素要移动到的目标位置
 
target = driver.find_element_by_id("xx")
 
# 执行元素的拖放操作
 
ActionChains(driver).drag_and_drop(element,target).perform()

8.drag_and_drop_by_offset #拖拽到某个坐标后松开

fc2a282cd25e393678a3e49728722e55.png

栗子:

# 将一个source元素 拖动到针对source坐上角坐在的x y处 可存在负宽度的情况和负高度的情况
ActionChains(driver).drag_and_drop_by_offset(source, x, y)

9. move_by_offset #鼠标移动到某个坐标

6e8341baf8f3f6c504c7e03b601f102d.png

栗子:

# 这种也是拖拽的一种方式,都是以源元素的左上角为基准,移动坐标
ActionChains(driver).click_and_hold(dom).move_by_offset(169,188).release().perform()
 
ActionChains(driver).move_by_offset(a['x'],a['y']).double_click(dis).perform()

10. move_to_element #鼠标移动到某个元素

374471be501fb9802b6fc6c73281c91e.png

栗子:

ActionChains(driver).move_to_element(e)

11. move_to_element_with_offset #移动到距某个元素(左上角)多少的位置

037d3916c9078d87f38e0371e713e50b.png

12. pause

3bf670835853b5076c948c9e08e1e0ba.png

13. release #在某元素上松开鼠标左键

d87fafd89d7322222a37515a640e2ea1.png

栗子:

ActionChains(driver).release()

三 键盘操作

keys 可以配合 key_down,和key_up ,做一些键盘上的操作

1. 引入包:

from selenium.webdriver.common.keys import Keys

2. key_down #某个键盘键被按下

b319edfd1136135404dfea4954aedb04.png


3. key_up # 松开某个键

29c0d5d1f3a6f6826121d21a6e26be02.png

4. send_keys #发送某些值到当前焦点元素

9e0c8772069bd62831e49127403ed453.png

5 send_keys_to_element #发送某些值到指定元素

e39c8c8b278618e238203bd2f2291499.png

6. keys

栗子:

# key_down 模拟键盘摁下某个按键 key_up 松开某个按键,与sendkey连用完成一些操作,每次down必须up一次否则将出现异常
ActionChains(driver).key_down(Keys.CONTROL,dom).send_keys('a').send_keys('c').key_up(Keys.CONTROL)
    .key_down(Keys.CONTROL,dom1).send_keys('v').key_up(Keys.CONTROL).perform()
#输入框输入内容
driver.find_element_by_id("kw").send_keys("seleniumm")
#删除多输入的一个 m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
#输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys(u"教程")
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
#ctrl+v 粘贴内容到输入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
#通过回车键盘来代替点击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
#回退键 ESC
driver.find_element_by_id("su").send_keys(Keys.ESCAPE)
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
send_keys(Keys.TAB) 制表键(Tab)
send_keys(Keys.ESCAPE) 回退键(Esc)
send_keys(Keys.ENTER) 回车键(Enter)
send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
send_keys(Keys.F1) 键盘 F1
send_keys(Keys.F12) 键盘 F12

eeaf6bd7143a74b750f9b2f31a8ca2fb.png

ALL keys:

class Keys(object):
    """
    Set of special keys codes.
    """
 
    NULL = 'ue000'
    CANCEL = 'ue001'  # ^break
    HELP = 'ue002'
    BACKSPACE = 'ue003'
    BACK_SPACE = BACKSPACE
    TAB = 'ue004'
    CLEAR = 'ue005'
    RETURN = 'ue006'
    ENTER = 'ue007'
    SHIFT = 'ue008'
    LEFT_SHIFT = SHIFT
    CONTROL = 'ue009'
    LEFT_CONTROL = CONTROL
    ALT = 'ue00a'
    LEFT_ALT = ALT
    PAUSE = 'ue00b'
    ESCAPE = 'ue00c'
    SPACE = 'ue00d'
    PAGE_UP = 'ue00e'
    PAGE_DOWN = 'ue00f'
    END = 'ue010'
    HOME = 'ue011'
    LEFT = 'ue012'
    ARROW_LEFT = LEFT
    UP = 'ue013'
    ARROW_UP = UP
    RIGHT = 'ue014'
    ARROW_RIGHT = RIGHT
    DOWN = 'ue015'
    ARROW_DOWN = DOWN
    INSERT = 'ue016'
    DELETE = 'ue017'
    SEMICOLON = 'ue018'
    EQUALS = 'ue019'
 
    NUMPAD0 = 'ue01a'  # number pad keys
    NUMPAD1 = 'ue01b'
    NUMPAD2 = 'ue01c'
    NUMPAD3 = 'ue01d'
    NUMPAD4 = 'ue01e'
    NUMPAD5 = 'ue01f'
    NUMPAD6 = 'ue020'
    NUMPAD7 = 'ue021'
    NUMPAD8 = 'ue022'
    NUMPAD9 = 'ue023'
    MULTIPLY = 'ue024'
    ADD = 'ue025'
    SEPARATOR = 'ue026'
    SUBTRACT = 'ue027'
    DECIMAL = 'ue028'
    DIVIDE = 'ue029'
 
    F1 = 'ue031'  # function  keys
    F2 = 'ue032'
    F3 = 'ue033'
    F4 = 'ue034'
    F5 = 'ue035'
    F6 = 'ue036'
    F7 = 'ue037'
    F8 = 'ue038'
    F9 = 'ue039'
    F10 = 'ue03a'
    F11 = 'ue03b'
    F12 = 'ue03c'
 
    META = 'ue03d'
    COMMAND = 'ue03d'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值