要实现拖拽印章的动作,我引入ActionChains类模拟鼠标拖动,但却发现没有效果

#通过指定坐标来拖动,没有效果
drag_and_drop_by_offset().perform()

#通过source和target指定两个位置拖动,没有效果
drag_and_drop().perform()

#然后还试了分步拖动,还是没效果
click_and_hold().perform()
move_to_element().perform()
release().perform()

python selenium 鼠标移动到 selenium的鼠标拖拽不生效_selenium


元素是可以定位到的,但是试了Selenium ActionChains所有拖动的方法,就是没有拖动的效果,网上搜索资料,有这么几种答案:

  1. Selenium 的Action有不支持HTML5的拖拽的问题,可以通过js写个拖动方法,然后调用。
  2. 物理模式模拟鼠标操作。
  3. 引入pyautogui包,实现web前端带轨迹拖拽功能,解决ActionChains拖拽失效问题。

物理模式模拟鼠标操作

import win32api, win32con #导入这两个包

# 移动到某点坐标
win32api.SetCursorPos((782, 355))
time.sleep(0.5)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 782, 355)
time.sleep(0.5)
win32api.mouse_event(win32con.MOUSEEVENTF_MOVE, 300, 0)
time.sleep(1)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0)

#这种物理模式并没有效果,而且我觉得这样方法怪怪的,并没有定位元素,只是单纯的物理模拟,感觉有点背离自动化测试,而且不稳定

使用pyautogui包,实现拖拽

印章的那个div盒子有个draggable=“true”,是可拖动的,但是Selenium自带的ActionChains的拖动方法都没有效果,自带的方法是一瞬间从点A到点B,也有可能是因为印章拖动的时候产生的是新元素,而导致自带拖动方法没有效果,有一些前段的交互,必须有鼠标轨迹才能成功的实现拖拽功能。

import pyautogui

# 定位起始元素
source = driver.find_element_by_xpath('')
# 让鼠标移动到起点元素上
pyautogui.moveTo(source .location['x']+20, source .location['y']+125)
# 定位要拖拽到的位置元素
target= driver.find_element_by_xpath('')
# 实现拖拽功能
pyautogui.dragTo(target.location['x']+20, target.location['y']+155, duration=1)

折腾了一天,搜罗了很多方法才知道引入这个包会如此简单就解决拖动的问题,一直在纠结为啥自带的拖动方法没有效果/(ㄒoㄒ)/~~
UI自动化之路,有些坑只有踩了才知道,公司的自动化测试才刚起步吧,目前的测试工作还能应付的来,但我不想仅仅做一些的功能业务测试,自己挤时间学习,也没有大佬带飞,遇到不会的问题只能自己搜资料,也许只需要一分钟解决的问题,却得花一天的功夫去定位出错点,然后找解决方法。不过无论对工作还是对自己职业发展,都有好处。加油!扛起自动化的大旗!O(∩_∩)O