ActionChains是一种自动化低级交互的方式,如鼠标移动、鼠标按钮动作、按键和上下文菜单交互,这对于进行更复杂的操作(如悬停和拖放)非常有用
参考资料
执行模式
当调用ActionChains对象上的动作方法时,动作不会立即执行,动作被存储在ActionChains对象的队列中,当调用 perform()
方法时,事件会按照队列中动作被调用的顺序被触发
写法有两种模式:链式模式
和 分步模式
,无论哪种方式,都会按照调用的顺序,一个接一个地执行这些动作
链式执行
1 2 3 4
| 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()
|
分步执行
1 2 3 4 5 6 7
| 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
| ActionChains(driver).click(on_element)
|
on_element
:要点击的元素,为 None
时点击当前鼠标位置
松开元素上的鼠标按钮
1
| ActionChains(driver).release(on_element)
|
on_element
:要点击的元素,为 None
时在当前鼠标位置松开
点击鼠标左键不松开
1
| ActionChains(driver).click_and_hold(on_element)
|
on_element
:要点击的元素,为 None
时点击当前鼠标位置
双击鼠标左键
1
| ActionChains(driver).double_click(on_element)
|
on_element
:要双击的元素,为 None
时双击当前鼠标位置
点击鼠标右键
1
| ActionChains(driver).context_click(on_element)
|
on_element
:要点击的元素,为 None
时点击当前鼠标位置
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import time from selenium import webdriver from selenium.webdriver import ActionChains
driver = webdriver.Chrome() driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')
time.sleep(2)
单击 = driver.find_element_by_id('d') 双击 = driver.find_element_by_id('s') 右键 = driver.find_element_by_id('y')
动作 = ActionChains(driver)
动作.click(单击).double_click(双击).context_click(右键).perform()
time.sleep(5)
driver.quit()
|
鼠标拖拽
方法
在源元素上按住鼠标左键,然后移动到目标元素并释放鼠标按钮
1
| ActionChains(driver).drag_and_drop(source, target)
|
source
:鼠标点击的元素
target
:鼠标指向的元素
在源元素上按住鼠标左键,然后移动到目标坐标处并释放鼠标按钮
1
| ActionChains(driver).drag_and_drop_by_offset(source, xoffset, yoffset)
|
source
:鼠标点击的元素
xoffset
:要移动到的X偏移量(水平方向)
yoffset
:要移动到的Y偏移量(垂直方向)
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| import time from selenium import webdriver from selenium.webdriver import ActionChains
driver = webdriver.Chrome() driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')
time.sleep(2)
滑块 = driver.find_element_by_class_name('slider')
动作 = ActionChains(driver)
动作.drag_and_drop_by_offset(滑块, 100, 0).perform()
time.sleep(5)
driver.quit()
|
鼠标移动
方法
将鼠标从当前鼠标位置移到偏移处
1
| ActionChains(driver).move_by_offset(xoffset, yoffset)
|
xoffset
:要移动到的X偏移量,为正或负
yoffset
:要移动到的Y偏移量,为正或负
将鼠标移动到元素的中间
1
| ActionChains(driver).move_to_element(to_element)
|
on_element
:要移动到的元素
鼠标移动到距离指定元素的偏移量,偏移量是相对于元素的左上角而言的
1
| ActionChains(driver).move_to_element_with_offset(to_element, xoffset, yoffset)
|
on_element
:要移动到的元素
xoffset
:要移动到的X偏移量
yoffset
:要移动到的Y偏移量
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| import time from selenium import webdriver from selenium.webdriver import ActionChains
driver = webdriver.Chrome() driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')
time.sleep(2)
滑块 = driver.find_element_by_class_name('slider')
动作 = ActionChains(driver)
动作.click_and_hold(滑块).move_by_offset(100, 0).release(滑块).perform()
动作.click_and_hold(滑块).move_to_element_with_offset(滑块, 200, 0).release(滑块).perform()
time.sleep(5)
driver.quit()
|
模拟按键
模拟按键可以使用 WebElement
对象的 send_keys() 方法,也可以使用 ActionChains
对象提供的方法
方法
按下某个键盘键,不释放
1
| ActionChains(driver).key_down(value, element)
|
只能与修饰键(Control、Alt和Shift)一起使用
value
:修饰键,值在 Keys 类中定义
element
:定位的元素(WebElement对象),为 None
时则发送一个键到当前重点元素
释放一个修饰键
1
| ActionChains(driver).key_up(value, element)
|
value
:修饰键,值在 Keys 类中定义
element
:定位的元素(WebElement对象),为 None
时则发送一个键到当前重点元素
发送某个键盘键到当前的焦点元素
1
| ActionChains(driver).send_keys(*keys_to_send)
|
keys_to_send
:某个键比如 'a'
,修饰键常量可以在 Keys 类中找到
发送某个键盘键到指定元素
1
| ActionChains(driver).send_keys_to_element(element, *keys_to_send)
|
element
:定位的元素(WebElement对象)
keys_to_send
:某个键比如 'a'
,修饰键常量可以在 Keys 类中找到
实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import time from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome() driver.get('https://www.gaoyuanqi.cn/python-html-1/#more')
time.sleep(2)
webelement = driver.find_element_by_name('t2')
webelement.send_keys('雨园博客')
ActionChains(driver).key_down(Keys.CONTROL, webelement).send_keys('a').key_up(Keys.CONTROL, webelement).perform()
ActionChains(driver).key_down(Keys.CONTROL, webelement).send_keys('x').key_up(Keys.CONTROL, webelement).perform()
webelement.send_keys(Keys.CONTROL, 'v')
time.sleep(5)
driver.quit()
|
其它
执行存储的动作
1
| ActionChains(driver).perform()
|
清除已经存储在本地和远程端的操作
1
| ActionChains(driver).reset_actions()
|
暂停指定持续时间的所有输入
1
| ActionChains(driver).pause(seconds)
|
seconds
:秒