我想用selenium python实现一个简单的拖放操作。我使用的是Chrome WebDriver,下面是我的代码。什么都没发生。任何帮助都非常赞赏。
{{1}}
答案 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)