当你需要执行复杂的操作时,比如将一个元素按住拖动到另一个元素上去,需要移动鼠标然后点击并按下键盘某个按键等等。
当然,在 Web 页面上,这种操作好像比较少。
但是,如果遇到了怎么办呢?这就需要用到 ActionChains 这个类啦。
ActionChains 提供了对动作的链式操作,也就是可以生成一个操作的队列,将复杂的操作过程分解成单个操作,然后组合起来一次性执行。
这里面主要是鼠标操作,加上一些键盘操作。
以简单的鼠标移动为例,京东首页上的商品二级分类默认处于隐藏状态,需要将鼠标移动到一级分类上才会显示。
?
我们可以模拟鼠标移动,到元素上然后再点击二级菜单,比如我们先点击家用电器,再点击超薄电视。
# 两种写法,一种是直接链式调用,另一种分别调用
# 直接链式调用
from selenium.webdriver import ActionChains
# ... 省略打开过程
e = driver.find_element_by_link_text("家用电器")
# 将鼠标悬停在家用电器上,暂停0.1s
ActionChains(driver).move_to_element(e).pause(0.1).perform()
# 第二种
action = ActionChains(driver)
action.move_to_element(e)
action.pause(0.1)
action.perform()
无论哪种方式,动作都是按照它们被调用的顺序执行。
通过 ActionChains 的对象生成操作队列,在没有执行提交 perform() 之前,所有操作只是暂存于队列中,不会实际在页面上操作,需要执行 perform() 时才会实际执行操作。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】
除了上面的鼠标悬停 move_to_element 操作外,还有其他的一些操作:
1. move_by_offset(xoffset, yoffset) 鼠标移动偏移量
ActionChains(driver).move_by_offset(100, 100).perform()
偏移量:?从当前位置增加和减少的坐标值, 正数为增加,负数为减少。
从当前鼠标位置向右下移动,假设当前位置为(300,500),则移动到(400, 600)。
2. move_to_element(to_element)鼠标移动到指定元素
e = driver.find_element_by_id('su')
ActionChains(driver).move_to_element(e).perform()
3. move_to_element_with_offset(to_element, xoffset, yoffset) 将鼠标移动到基于元素的偏移量,偏移量基于鼠标左上角的坐标点
e = driver.find_element_by_id('su')
ActionChains(driver).move_to_element_with_offset(e, 100, 100).perform()
移动到 id 为 su 的元素右下方。
1. click(on_element=None) 点击指定元素,如果没有指定元素,则点击当前鼠标所在位置
e = driver.find_element_by_id('su')
ActionChains(driver).click(e).perform()
2. double_click(on_element=None) 双击元素,如果没有指定元素则在当前鼠标位置双击
e = driver.find_element_by_id('su')
ActionChains(driver).double_click(e).perform()
3. context_click(on_element=None) 在元素上点击鼠标右键,如果没有指定则在当前鼠标位置单击右键
e = driver.find_element_by_id('su')
ActionChains(driver).context_click(e).perform()
4. click_and_hold(on_element=None) 鼠标按下不松
e = driver.find_element_by_id('su')
ActionChains(driver).click_and_hold(e).perform()
注意,此时鼠标一直处于按下状态,直到执行 release() 释放鼠标的操作。
这类操作相当于是鼠标按住某个元素,然后移动鼠标,实现对元素的拖动操作。当然前提是你操作的元素要能够支持拖动。
1. drag_and_drop(source, target) 在 source 元素上按下鼠标左键,并拖动到 target 元素并松开鼠标
e1 = driver.find_element_by_id('source')
e2 = driver.find_element_by_id('target')
ActionChains(driver).drag_and_drop(e1, e2).perform()
按住 e1 元素,拖动到 e2 元素。
2. drag_and_drop_by_offset(source, xoffset, yoffset) 在source元素上按下鼠标左键,并按偏移量拖动
e = driver.find_element_by_id('source')
ActionChains(driver).drag_and_drop_by_offset(e, -100, -100).perform()
从 e 元素的位置向左上角移动。
1.?send_keys(*keys_to_send)
在当前焦点元素发送按键
ActionChains(driver).send_keys('手机').perform()
2.?send_keys_to_element(self, element, *keys_to_send)
向指定元素发送按键
e = driver.find_element_by_id('kw')
ActionChains(driver).send_keys_to_element(e, '测试').perform()
3. key_down(value, element=None) 按下一个特殊按键
只能用于 Ctrl, Alt,Shift 键,注意此时按键只是按下并没有松开,用于进行按键组合操作,如 Ctrl+A。
4. key_up( value, element=None) 释放一个按下的键
与 key_down() 配套使用,用于释放一个已按下的按键,只能用于 Ctrl, Alt,Shift 键
如果要发送组合键,要这么写:
ActionChains(driver).key_down(Keys.CONTROL) \
.send_keys('c').key_up(Keys.CONTROL).perform()
1. perform() 提交队列中的所有操作
所有操作都需要通过 perform() 才会实际提交到浏览器。
2. rest_actions() 清空队列中的操作
将队列中已存储的操作清空。
3. pause(seconds) 暂停所有动作
相当于等待,用于链式操作过程中的等待。
4. release(on_element=None) 松开按下的鼠标
如果有鼠标按下的操作,那么需要通过 release() 释放鼠标。
下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
最后: 可以在公众号:自动化测试老司机?! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!