如何在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]);
结果之前/之后: