我们在实现UI自动化过程中,有时会遇到鼠标模拟操作,如鼠标悬停后,菜单划出;鼠标按下后,下拉展开;单击、双击、拖动等等;但我们常常对鼠标的单击和双击比较了解(click和doubleclick)但是其他的如何使用呢?且看下面分解:
1、selenium提供了一个类来专门处理鼠标的动作-selenium.webdriver.common.action_chains.ActionChains(driver),它基本能满足所有我们对鼠标的操作
2、ActionChains是怎么工作的呢?其实当我们调用它时,他并不会立即执行,而是如一个管道,我们只是将要操作的一系列动作塞入管道中;当打开开关时(调用perform方法),就会按照我们塞入的顺序,依次执行;
3、写法1:链式写法
# 鼠标悬停到指定元素
def moveMouse2(self, locate, locateType=By.XPATH):
WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_element_located((locateType, locate)))
DH = self.driver.find_element(locateType, locate) # 得到要操作的对象元素
ActionsChains(self.driver).move_to_element(DH).click(DH).perform()
4、写法2:分步骤写法
# 鼠标悬停到指定元素
def moveMouse2(self, locate, locateType=By.XPATH):
WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_element_located((locateType, locate)))
DH = self.driver.find_element(locateType, locate) # 得到要操作的对象元素
actions = ActionChains(self.driver) #创建actionChains对象
actions.move_to_element(DH) #塞入鼠标悬停事件,并绑定要操作的元素DH
actions.click(DH) #塞入点击鼠标事件,并绑定要操作的元素DH;
actions.perform() # 打开开关,触发执行
# 特别注意,上面步骤中,是可以绑定不同元素的;
5、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) ——发送某个键到指定元素