Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Selenium WebDriver drag-and-drop

I cannot get drag-and drop working with the Python WebDriver bindings. I am working with Google Chrome and Firefox on Mac OS X. There is a thread here where someone had a similar problem.

I have tried using ActionsChains:

from selenium import webdriver
from selenium.webdriver import ActionChains
driver = webdriver.Chrome()
actionChains = ActionChains(driver)

actionChains.drag_and_drop(source, target).perform()

Have you managed to get the Python WebDriver drag-and-drop working?

like image 224
Randomblue Avatar asked Jan 12 '12 10:01

Randomblue


4 Answers

For the sake of giving an updated answer, I have verified that this does in fact work on Mac now.

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

driver = webdriver.Firefox()
driver.get("your.site.with.dragndrop.functionality.com")
source_element = driver.find_element_by_name('your element to drag')
dest_element = driver.find_element_by_name('element to drag to')
ActionChains(driver).drag_and_drop(source_element, dest_element).perform()

Reference

like image 188
d_rez90 Avatar answered Oct 01 '22 01:10

d_rez90


Action Chains don't currently work on Mac. If you tried the code above on Linux or Windows it would work. ChromeDriver is close to getting this right but still needs work AFAIK.

like image 45
AutomatedTester Avatar answered Oct 01 '22 01:10

AutomatedTester


action = ActionChains(driver)
action.click_and_hold(source).pause(4).move_to_element(target).release(target).perform()

This will also do drag and drop.

like image 28
siddharth khandelwal Avatar answered Oct 01 '22 03:10

siddharth khandelwal


It's hard to tell exactly without some sample HTML for the source and the target.

You could try using drag_and_drop_by_offset(self, source, xoffset, yoffset) instead with a small value for the offset parameters. Sometimes that works.

You could also try to adapt this C# example which uses mouse_down_at, mouse_move_at and mouse_up_at instead.

like image 44
shamp00 Avatar answered Oct 01 '22 02:10

shamp00