selenium drag_and_drop不生效的解决办法

 更新时间:2023年03月19日 10:42:51   作者:joker_zsl  
本文主要介绍了selenium drag_and_drop不生效的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

做自动化时发现用drag_and_drop模拟拖拽没效果,页面上只能看到元素source闪了一下,但是并没有拖拽到元素target上(推测可能是我用系统页面在拖拽时有个JS效果,但是drag_and_drop模拟拖拽的时候执行太快没能触发JS,所以没有把这两个元素拖拽到一起)。

通过不断尝试,终于解决了,这里记录一下,希望其他人遇到类似情况时能有所启发。方法1是我尝试的过程;方法2是我看到的另一种方法,虽然试验了下没效果,但说不定对其他的拖拽场景是有效的。

方法1:分解drag_and_drop动作

从源码可以看出drag_and_drop的源码执行了两个操作,既然直接用drag_and_drop不行,那调整下这两个操作或许可行

    def drag_and_drop(self, source, target):
        """
        Holds down the left mouse button on the source element,
           then moves to the target element and releases the mouse button.
        :Args:
         - source: The element to mouse down.
         - target: The element to mouse up.
        """
        self.click_and_hold(source)
        self.release(target)
        return self

drag_and_drop里有两个动作:click_and_hold(在source元素上单击鼠标不松开),release(在target元素上释放点击状态的鼠标)。中间加一个鼠标移动的动作是否可行呢?

我把拖拽的流程改成了:

        ActionChains(self.driver).click_and_hold(source).perform()       
        ActionChains(self.driver).move_by_offset(x, y).perform()
        ActionChains(self.driver).release(target).perform()

试验了一下,在执行move_by_offset动作的时候能触发JS的效果,只不过位移的xy不准确,触发不了另一个JS,只要计算好要偏移的位置就好了

最终的实现:

    def drag_and_drop(self):
        source = self.find_element_and_scroll_into_view(source_loc)
        target = self.find_element_and_scroll_into_view(target_loc)
        # 先移动一点 触发js效果 触发后元素变小 重新获取元素以便能准确计算鼠标偏移量
        ActionChains(self.driver).click_and_hold(source).move_by_offset(5, 0).perform()
        drag_source = self.find_element(change_source_loc)
 
        x1, x2 = (drag_source.location.get("x"), drag_source.location.get("x") + drag_source.size.get("width"))
        y1, y2 = (drag_source.location.get("y"), drag_source.location.get("y") + drag_source.size.get("height"))
        source_middle_x = (x1 + x2) / 2
        source_middle_y = (y1 + y2) / 2
        x3, x4 = (target.location.get("x"), target.location.get("x") + target.size.get("width"))
        y3, y4 = (target.location.get("y") + 0.5 * target.size.get("height"), target.location.get("y") + target.size.get("height"))
        target_middle_x = (x3 + x4) / 2
        target_middle_y = (y3 + y4) / 2
        x = target_middle_x - source_middle_x
        y = target_middle_y - source_middle_y
 
        ActionChains(self.driver).move_by_offset(x, y).perform()
        ActionChains(self.driver).release(target).perform()

 拖拽效果:

 方法2:使用seletools解决

虽然我试了下没效果,但是感觉是有用的,这里一并记录下。

selenium的drag_and_drop方法在某些场景下无效,这是官方很久就已经知道的BUG,只不过没有在源码中修复,而是提供了单独的包,因为David Burnes(核心 Selenium 提交者)认为拖放错误是一个webdriver网络驱动问题,在Selenium中提供任何暂时避开网络的方法并不是一个好主意。详细内容可以阅读文章「Selenium Drag and Drop Bug Workaround

安装

pip install seletools

使用

from seletools.actions import drag_and_drop
 
source = driver.find_element(xxx)
target = driver.find_element(xxx)
drag_and_drop(driver, source, target)

到此这篇关于selenium drag_and_drop不生效的解决办法的文章就介绍到这了,更多相关selenium drag_and_drop不生效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python利用appium实现模拟手机滑动操控的操作

    Python利用appium实现模拟手机滑动操控的操作

    Appium 是一个开源、跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持 iOS, Android 和 FirefoxOS 平台。本文将利用appium实现模拟手机滑动操控的操作,感兴趣的可以了解一下
    2022-07-07
  • 用python画城市轮播地图

    用python画城市轮播地图

    轮播地图可以在很多方面有实际应用,所以就介绍给大家,并给出个实际操作案例,感兴趣的朋友可以参考下
    2021-05-05
  • python namedtuple函数的使用

    python namedtuple函数的使用

    今天介绍collections里面的一个好用的小函数: namedtuple函数(不创类而可以拥有类的便利),例如可以使用object.attribute
    2021-06-06
  • python中文编码与json中文输出问题详解

    python中文编码与json中文输出问题详解

    Python的编码问题还是很让人头疼的,做下笔记帮助别人,也帮助自己,下面这篇文章主要给大家介绍了关于python中文编码与json中文输出问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-08-08
  • Python机器学习之决策树算法实例详解

    Python机器学习之决策树算法实例详解

    这篇文章主要介绍了Python机器学习之决策树算法,较为详细的分析了实例详解机器学习中决策树算法的概念、原理及相关Python实现技巧,需要的朋友可以参考下
    2017-12-12
  • 利用Python爬取微博数据生成词云图片实例代码

    利用Python爬取微博数据生成词云图片实例代码

    这篇文章主要给大家介绍了关于利用Python爬取微博数据生成词云图片的相关资料,文中通过示例代码介绍非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-08-08
  • python使用请求头部headers处理403错误

    python使用请求头部headers处理403错误

    有时候请求一个网页的时候,无论是GET请求还是POST请求都访问不了,并出现403错误,这是因为这些网页为了防止恶意采集信息,使用了反爬机制,本文给大家介绍了python如何使用请求头部headers处理403错误,需要的朋友可以参考下
    2024-03-03
  • Pygame库200行代码实现简易飞机大战

    Pygame库200行代码实现简易飞机大战

    本文主要介绍了Pygame库200行代码实现简易飞机大战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • OpenCV制作Mask图像掩码的案例

    OpenCV制作Mask图像掩码的案例

    这篇文章主要介绍了OpenCV制作Mask图像掩码的案例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • python人工智能TensorFlow自定义层及模型保存

    python人工智能TensorFlow自定义层及模型保存

    这篇文章主要为大家介绍了python人工智能TensorFlow自定义层及模型保存示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11

最新评论