在目前(2024-09-18)得Selenium官方手册中,模拟鼠标操作基本上都是通过ActionChains完成的,唯独有一动作,是通过ActionBuilder完成的。
而前者ActionChains,主要是通过offset,也就是坐标偏移量来实现的。看文档,使用它基本需要一个找一个元素作为参考,才能执行;而笔者想通过默认坐标来(左上角(0, 0))进行位置移动,自然而然想到了后者ActionBuilder。
看手册的时候,发现ActionBuilder的示例相对ActionChains有些不同,第一感觉是繁琐一些,示例代码如下:
action = ActionBuilder(driver)
action.pointer_action.move_to_location(8, 0)
action.perform()
实际使用的过程中,报了好几次错误,始才发现确实要注意几个区别。因为花了点点儿的时间,所以特意总结出来,分享给可能同样会遇到的朋友。
1、要使用首先得引入对应的包,代码如下:
from selenium.webdriver.common.actions.action_builder import ActionBuilder
可以看出,和ActionChains的包也不相同。笔者开始搜索的时候,出来的有些结果告知不需要单独的包,明显是错误的答案。有遇到的朋友特别注意下。
ActionChains的包引入也粘到下面,方便对比观看:
from selenium.webdriver.common.action_chains import ActionChains
2、必须按照示例那样分开写才行,不能像ActionChains一样,使用一长串的“.”最后perform()。
笔者根据报错提示,得知两点:
一、‘PointerActions’ object has no attribute ‘perform’,意思就是示例第二句代码,pointer_action其实是会使用PointerActions这个对象,而这个对象没有perform()方法;
二、‘ActionBuilder’ object has no attribute ‘click’,意思就是ActionBuilder对象没有click()方法。
得知这几点,就明白为什么示例会那么写了。。
而如果通过ActionBuilder将鼠标移到指定位置后,想要进行点击操作,那么还得再使用ActionChains的click()方法。多一行的代码。也就是整体代码如下:
action = ActionBuilder(driver)
action.pointer_action.move_to_location(95, 65)
action.perform()
ActionChains(driver).move_by_offset(0, 0).click().perform()
完毕。