解决Selenium ActionChains拖动元素无效

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

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

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

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

手工拖动的效果
元素是可以定位到的,但是试了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

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值