I see you are using chromeDriver. There are more unsolved questions: "Drag-and-drop with ChromeDriver", "Python Selenium WebDriver drag-and-drop" so if you can not find problem, maybe it at this time unsolvable then I suggest try run test with different browser.
As always you should be 100% sure that for
drag_and_drop method you give correct parameters. I see you check visibility but to be sure I recommend two things:
actionChains.drag_and_drop. I use sleep method only for debug purpose. If it works with long sleep then it means that methods like waitForElement or waitForPageLoad is incorrectly implemented (need improve).
- print out in console info about
drag_and_drop source and targer objects just before it uses as parameters. Try print out tag name, id, class or something which make sure that correct elements are used.
You mentioned that Web Application based UI based complex jQuery methods, which means that it can have such functions like change DIV backgrounds when mouse is over or something like that. It can even change DIV element class names, size or other css property which can lead your
drag_and_drop target object different than it was before you start drag it. You can try debug what happens to target element when mouse is over
move_to_element print out info about mouse_on_target element object, compare with target_before_mouse_on object. Even if object mouse_on_target did't changed something on parent element can be changed. In this case Java trows special exception
InvalidElementStateException when I try use such element. However I do not know how python react in mentioned case. You can try test with entering target coordinates manually using
drag_and_drop_by_offset (see on documentation) . With this method at least you will know on which place it try release target.