无法使用Selenium(python)执行拖放操作

无法使用Selenium(python)执行拖放操作,python,selenium,drag-and-drop,Python,Selenium,Drag And Drop,我正在用python中的Selenium在私有web应用程序上执行拖放或点击保持操作 我试图在一个公开的例子中重现我的错误: 下面是我的拖放/点击并按住的基本代码 from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('http://

我正在用python中的Selenium在私有web应用程序上执行拖放或点击保持操作

我试图在一个公开的例子中重现我的错误:

下面是我的拖放/点击并按住的基本代码

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get('http://the-internet.herokuapp.com/drag_and_drop')
dragged = driver.find_element(By.ID, "column-a")
dropped = driver.find_element(By.ID, "column-b")

#Drag and drop

actions = ActionChains(driver)
actions.drag_and_drop(dragged, dropped).perform() 
#column A is selected but not dragged

#Click and hold
actions = ActionChains(driver)
actions.move_to_element(dragged).click_and_hold().move_to_element(dropped).release().perform()
#Same result : column a is selected but not dragged

通过搜索stackoverflow,我发现了一个使用javascript的公共示例的“解决方案”。

这非常适合直接在python中工作,但需要确保拖放的元素具有ID。我目前从事的私人项目并非如此

硒有什么不对吗?
JS中是否有任何方法可以指定xpath而不是id?

我终于找到了答案

见下文:

我使用drag-drop.min.js中的函数

下面是python中的一个简短示例:

JS_DRAG_AND_DROP = "function h(a,b,c,d){var k=l.createEvent('DragEvent');k.initMouseEvent(b,!0,!0,l.defaultView,0,0,0,m,n,w,x,y,!1,0,null);Object.setPrototypeOf(k,null);k.dataTransfer=g;Object.setPrototypeOf(k,DragEvent.prototype);a.dispatchEvent(k);setTimeout(d,c)}var a=arguments,c=a[0],d=a[1],q=a[2]||0,r=a[3]||0,t=a[4]||1;a=a[5]||'';var x='alt'===a||'\ue00a'===a,w='ctrl'===a||'\ue009'===a,y='shift'===a||'\ue008'===a,l=c.ownerDocument;a=c.getBoundingClientRect();var e=d?d.getBoundingClientRect():a,m=a.left+a.width/2,n=a.top+a.height/2,u=e.left+(q?q:e.width/2),v=e.top+(r?r:e.height/2),p=l.elementFromPoint(m,n),f=l.elementFromPoint(u,v);for(d=p;d&&!d.draggable;)d=d.parentElement;if(!d||!c.contains(p))throw c=Error('source element is not interactable/draggable'),c.code=15,c;if(!f)throw c=Error('target element is not interactable'),c.code=15,c;var g={constructor:DataTransfer,effectAllowed:null,dropEffect:null,types:[],files:Object.setPrototypeOf([],null),_items:Object.setPrototypeOf([],{add:function(a,b){this[this.length]={_data:''+_data,kind:'string',type:b,getAsFile:function(){},getAsString:function(a){a(this._data)}};g.types.push(b)},remove:function(a){Array.prototype.splice.call(this,a&65535,1);g.types.splice(a&65535,1)},clear:function(a,b){this.length=0;g.types.length=0}}),setData:function(a,b){this.clearData(a);this._items.add(b,a)},getData:function(a){for(var b=this._items.length;b--&&this._items[b].type!==a;);return 0<=b?this._items[b]._data:null},clearData:function(a){for(var b=this._items.length;b--&&this._items[b].type!==a;);this._items.remove(b)},setDragImage:function(a){}};'items'in DataTransfer.prototype&&(g.items=g._items);e=f.getBoundingClientRect();h(p,'dragstart',t,function(){var a=f.getBoundingClientRect();m=a.left+u-e.left;n=a.top+v-e.top;h(f,'dragenter',1,function(){h(f,'dragover',t,function(){f=l.elementFromPoint(m,n);h(f,'drop',1,function(){h(p,'dragend',1,function(){})})})})})"

def drag_and_drop(driver, source, target=None, offsetX=0, offsetY=0, delay=25, key=None) :
  driver.execute_script(JS_DRAG_AND_DROP, source, target, offsetX, offsetY, delay, key)
  time.sleep(delay * 2 / 1000)

driver = webdriver.Chrome()
driver.get("http://the-internet.herokuapp.com/drag_and_drop")


# drag and drop Glass
source = driver.find_element_by_xpath("//*[@id='column-a']")
target = driver.find_element_by_xpath("//*[@id='column-b']")
drag_and_drop(driver, source, target)

[代码>该公司目前的拖拽和(代码)是一个,但该公司目前的拖拽和(代码)是一个,该公司的拖拽和(代码)是一个,该公司的拖拽和(代码)是一个,该公司的拖拽和(代码)是一个,该公司的拖拽和(代码)是一个,该公司的拖拽和(代码)是一个,该公司的拉格文是一个)的,该公司的拉格文是该公司的)是一个,以及k.引发该公司的....该公司是该公司是该事件是该公司的,b,b,b,b,b,b,b,b,,,、0,、0,0,0,0,0,0,0,0,0,0,l.0,l.0,0,l.0,l..默认视图,l.....默认视图,l.....................1;a=a[5]||2008年10月,w=ctrl=a,c.d.d.d.获取边界.取得边界.取得边界.取得边界.取得边界.取得边界..取得边界.取得.取得.c.d.取得.取得.取得的.取得的结果.第二,n=a.a.左+a.宽度/2,n=a.宽度/宽度/2,n=a.顶部+a.高度/高度/2,高度/高度/2,u=e.左+高度/2,u=e.左+e.左+B.高度/左+2,u.左+左+左+左+左+左+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右+右(f=l.elementFromPoint(u,v);对于(d=p;d&&!d.Dragable;)d=d.parentElement;if(!d | |!c.contains(p))throw c=Error('source element's not interactivatable/draggable'),c.code=15,c;if(!f)throw c=Error('target element's not interactivatable'),c.code=15,c;var g={构造函数:数据传输,effectAllowed:null,dropEffect:null,类型:[],文件:Object.setPrototypeOf([],null),\u项:Object.setPrototypeOf([],{add:function(a,b){this[this.length]={{u data:''+{u data,种类:'string',type:b,getAsFile:function(){},getastring:function(a){a(this.length)};g.types.push(b)},remove:function(a){Array.prototype.splice.call(this,a&65535,1);g.types.splice(a&65535,1)},clear:function(a,b){this.length=0;g.types.types.length=0}),setData:function(a,clearB){a,b){,getData:function(a){for(var b=this.\u items.length;b--&&this.\u items[b].键入!==a;);返回0我希望下面的代码能够清楚地说明您在Java中遇到的问题

公共类测试{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
System.setProperty(“webdriver.chrome.driver”,“/chromedriver_win32/chromedriver.exe”);
WebDriver驱动程序=新的ChromeDriver();
驱动程序。获取(“https://jqueryui.com/droppable/");
System.out.println(driver.findElements(按.tagName(“iframe”)).size());
driver.switchTo().frame(driver.findElement(By.className(“demo frame”));
driver.findElement(By.id(“draggable”))。单击();
动作a=新动作(驾驶员);
WebElement drag=driver.findElement(By.id(“draggable”);
WebElement drop=driver.findElement(By.id(“droppable”);
a、 拖放(拖放).build().perform();
driver.switchTo().defaultContent();
}
}

是“拖动”元素的目标"低于或高于原始位置?它们在提供的示例中完全处于同一级别。发布您需要获取的元素的html。它们使用css选择器,这里是一个列表。嗨,Jortega,谢谢您的回答,但我不理解您的意思。我的示例中提供的演示网站中提供了所有内容:I尝试使用id、css选择器、xpath进行选择……都不起作用。你能在演示网站上试试吗?如果你能提供html,我们可以在css中构建你需要的xpath。我无法让助手函数
simulateDragDrop
接受xpath……而不完全重建它。我认为你的JS_拖放函数有一个小错误或者:在_items.add函数中,您希望将_数据设置为“”+a,而不设置为_数据,因为这不存在并引发错误--
add:function(a,b){this[this.length]={u数据:“”+a,种类:'string',type:b,getAsFile:function(){},getAsString:function(a){a(this._数据)};g.types.push(b)},
---也许您可以使用多行字符串
JS_DRAG_AND_DROP = "function h(a,b,c,d){var k=l.createEvent('DragEvent');k.initMouseEvent(b,!0,!0,l.defaultView,0,0,0,m,n,w,x,y,!1,0,null);Object.setPrototypeOf(k,null);k.dataTransfer=g;Object.setPrototypeOf(k,DragEvent.prototype);a.dispatchEvent(k);setTimeout(d,c)}var a=arguments,c=a[0],d=a[1],q=a[2]||0,r=a[3]||0,t=a[4]||1;a=a[5]||'';var x='alt'===a||'\ue00a'===a,w='ctrl'===a||'\ue009'===a,y='shift'===a||'\ue008'===a,l=c.ownerDocument;a=c.getBoundingClientRect();var e=d?d.getBoundingClientRect():a,m=a.left+a.width/2,n=a.top+a.height/2,u=e.left+(q?q:e.width/2),v=e.top+(r?r:e.height/2),p=l.elementFromPoint(m,n),f=l.elementFromPoint(u,v);for(d=p;d&&!d.draggable;)d=d.parentElement;if(!d||!c.contains(p))throw c=Error('source element is not interactable/draggable'),c.code=15,c;if(!f)throw c=Error('target element is not interactable'),c.code=15,c;var g={constructor:DataTransfer,effectAllowed:null,dropEffect:null,types:[],files:Object.setPrototypeOf([],null),_items:Object.setPrototypeOf([],{add:function(a,b){this[this.length]={_data:''+_data,kind:'string',type:b,getAsFile:function(){},getAsString:function(a){a(this._data)}};g.types.push(b)},remove:function(a){Array.prototype.splice.call(this,a&65535,1);g.types.splice(a&65535,1)},clear:function(a,b){this.length=0;g.types.length=0}}),setData:function(a,b){this.clearData(a);this._items.add(b,a)},getData:function(a){for(var b=this._items.length;b--&&this._items[b].type!==a;);return 0<=b?this._items[b]._data:null},clearData:function(a){for(var b=this._items.length;b--&&this._items[b].type!==a;);this._items.remove(b)},setDragImage:function(a){}};'items'in DataTransfer.prototype&&(g.items=g._items);e=f.getBoundingClientRect();h(p,'dragstart',t,function(){var a=f.getBoundingClientRect();m=a.left+u-e.left;n=a.top+v-e.top;h(f,'dragenter',1,function(){h(f,'dragover',t,function(){f=l.elementFromPoint(m,n);h(f,'drop',1,function(){h(p,'dragend',1,function(){})})})})})"

def drag_and_drop(driver, source, target=None, offsetX=0, offsetY=0, delay=25, key=None) :
  driver.execute_script(JS_DRAG_AND_DROP, source, target, offsetX, offsetY, delay, key)
  time.sleep(delay * 2 / 1000)

driver = webdriver.Chrome()
driver.get("http://the-internet.herokuapp.com/drag_and_drop")


# drag and drop Glass
source = driver.find_element_by_xpath("//*[@id='column-a']")
target = driver.find_element_by_xpath("//*[@id='column-b']")
drag_and_drop(driver, source, target)