拖拽不使用Selenium Python

时间:2017-04-11 17:16:33

标签: python selenium selenium-webdriver drag-and-drop selenium-chromedriver

我想用selenium python实现一个简单的拖放操作。我使用的是Chrome WebDriver,下面是我的代码。什么都没发生。任何帮助都非常赞赏。

{{1}}

3 个答案:

答案 0 :(得分:1)

Selenium Drag&删除功能非常简单,您需要使用 Selenium ActionChains

ActionChains是一种自动执行低级别交互的方法,例如鼠标移动,鼠标按钮操作,按键和上下文菜单交互。这对于执行更复杂的操作非常有用,例如悬停和拖放。

请参阅documentation

在您的特定情况下,您需要确定操作的来源和目标(图像和其中一个框),然后调用drag_and_drop函数。

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("http://html5demos.com/drag")
source_element = driver.find_element_by_id('bin')
dest_element = driver.find_element_by_id('two')
ActionChains(driver).drag_and_drop(source_element, dest_element).perform()

答案 1 :(得分:1)

您现在可以执行此脚本作为快速修复程序(在Chrome和Firefox上都对我有效)。 https://gist.github.com/druska/624501b7209a74040175#file-native_js_drag_and_drop_helper-js

我所做的只是添加了 simulateDragDrop(arguments [0],arguments [1])

function simulateDragDrop(sourceNode, destinationNode) {
    var EVENT_TYPES = {
        DRAG_END: 'dragend',
        DRAG_START: 'dragstart',
        DROP: 'drop'
    }

    function createCustomEvent(type) {
        var event = new CustomEvent("CustomEvent")
        event.initCustomEvent(type, true, true, null)
        event.dataTransfer = {
            data: {
            },
            setData: function(type, val) {
                this.data[type] = val
            },
            getData: function(type) {
                return this.data[type]
            }
        }
        return event
    }

    function dispatchEvent(node, type, event) {
        if (node.dispatchEvent) {
            return node.dispatchEvent(event)
        }
        if (node.fireEvent) {
            return node.fireEvent("on" + type, event)
        }
    }

    var event = createCustomEvent(EVENT_TYPES.DRAG_START)
    dispatchEvent(sourceNode, EVENT_TYPES.DRAG_START, event)

    var dropEvent = createCustomEvent(EVENT_TYPES.DROP)
    dropEvent.dataTransfer = event.dataTransfer
    dispatchEvent(destinationNode, EVENT_TYPES.DROP, dropEvent)

    var dragEndEvent = createCustomEvent(EVENT_TYPES.DRAG_END)
    dragEndEvent.dataTransfer = event.dataTransfer
    dispatchEvent(sourceNode, EVENT_TYPES.DRAG_END, dragEndEvent)
}

simulateDragDrop(arguments[0], arguments[1]);

我将此项目另存为项目目录的 scripts 文件夹中的 drag_and_drop.js 文件。 然后我在测试中使用了下一个代码:

DRAGGABLE_SELECTOR = (By.CSS_SELECTOR, "div[draggable]")
DROPPABLE_SELECTOR = (By.CSS_SELECTOR, ".ReactCollapse--content > div > div > div > div > div > div[id]")
draggable = self.app.wd.find_element(*DRAGGABLE_SELECTOR)
droppable = self.app.wd.find_element(*DROPPABLE_SELECTOR)
f = open("scripts/drag_and_drop.js",  "r")
javascript = f.read()
f.close()
wd.execute_script(javascript, draggable, droppable)

另一件事:该脚本仅接受 CSS选择器找到的元素(因为它是JQuery脚本)!

答案 2 :(得分:0)

您现在可以尝试使用我上面提到的解决方法。 我也把它打包成一个 Python 包,所以它会很容易使用。

您可以使用 pip install seletools

安装软件包

用法示例是 here