如何在Selenium Webdriver中模拟HTML5拖放?

我正在使用Python 2.7和Selenium 2.44。

我想在Selenium WD中自动拖放操作,但根据其他相关文章,Selenium不支持HTML5中的操作 。 有没有什么办法来模拟Python中的拖放?

这是我试过的代码:

driver = webdriver.Firefox() driver.get("http://html5demos.com/drag") target = driver.find_element_by_id("one") source = driver.find_element_by_id("bin") actionChains = ActionChains(driver) actionChains.drag_and_drop(target, source).perform() 

并没有工作。

是的,Selenium 目前不支持 HTML5“拖放”:

  • 问题3604:使用Selenium Webdriver拖放HTML5

build议的解决方法之一是模拟HTML5通过JavaScript 拖放

  • 下载drag_and_drop_helper.js
  • 通过调用执行脚本execute_script()调用source元素上的simulateDragDrop()函数将target元素作为dropTarget

示例代码:

 with open("drag_and_drop_helper.js") as f: js = f.read() driver.execute_script(js + "$('#one').simulateDragDrop({ dropTarget: '#bin'});") 

问题是,它不会在你的情况下工作,因为它需要jQuery


现在我们需要弄清楚如何dynamic加载jQuery 。 谢天谢地, 有一个解决scheme 。

Python中的完整工作示例:

 from selenium import webdriver jquery_url = "jquery-1.11.2.min.js" driver = webdriver.Firefox() driver.get("http://html5demos.com/drag") driver.set_script_timeout(30) # load jQuery helper with open("jquery_load_helper.js") as f: load_jquery_js = f.read() # load drag and drop helper with open("drag_and_drop_helper.js") as f: drag_and_drop_js = f.read() # load jQuery driver.execute_async_script(load_jquery_js, jquery_url) # perform drag&drop driver.execute_script(drag_and_drop_js + "$('#one').simulateDragDrop({ dropTarget: '#bin'});") 

其中jquery_load_helper.js包含:

 /** dynamically load jQuery */ (function(jqueryUrl, callback) { if (typeof jqueryUrl != 'string') { jqueryUrl = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'; } if (typeof jQuery == 'undefined') { var script = document.createElement('script'); var head = document.getElementsByTagName('head')[0]; var done = false; script.onload = script.onreadystatechange = (function() { if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) { done = true; script.onload = script.onreadystatechange = null; head.removeChild(script); callback(); } }); script.src = jqueryUrl; head.appendChild(script); } else { callback(); } })(arguments[0], arguments[arguments.length - 1]); 

结果之前/之后: