docs: def drag_and_drop(self, source_selector, destination_selector, **kwargs):
          """Drag and drop
  
          Args:
              source_selector: (str)
              destination_selector: (str)
  
          Kwargs:
              use_javascript_dnd: bool; default:
                  config proxy_driver:use_javascript_dnd
          """
          self.info_log(
              "Drag and drop: source (%s); destination (%s)" %
              (source_selector, destination_selector)
          )
  
          use_javascript_dnd = kwargs.get(
              "use_javascript_dnd",
              "proxy_driver:use_javascript_dnd"
          )
  
          source_el = self.find(source_selector)
          destination_el = self.find(destination_selector)
  
          if use_javascript_dnd:
              try:
                  dnd_script = [
                      "function simulate(f,c,d,e){var b,a=null;for(b in eventMatchers)if(eventMatchers[b].test(c)){a=b;break}if(!a)return!1;document.createEvent?(b=document.createEvent(a),a=='HTMLEvents'?b.initEvent(c,!0,!0):b.initMouseEvent(c,!0,!0,document.defaultView,0,d,e,d,e,!1,!1,!1,!1,0,null),f.dispatchEvent(b)):(a=document.createEventObject(),a.detail=0,a.screenX=d,a.screenY=e,a.clientX=d,a.clientY=e,a.ctrlKey=!1,a.altKey=!1,a.shiftKey=!1,a.metaKey=!1,a.button=1,f.fireEvent('on'+c,a));return!0} var eventMatchers={HTMLEvents:/^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,MouseEvents:/^(?:click|dblclick|mouse(?:down|up|over|move|out))$/};",  # noqa
                      "var source = arguments[0],destination = arguments[1];",
                      "simulate(source, 'mousedown', 0, 0);",
                      "simulate(source, 'mousemove', destination.offsetLeft, destination.offsetTop);",  # noqa
                      "simulate(source, 'mouseup', destination.offsetLeft, destination.offsetTop);"  # noqa
                  ]
                  self._driver.execute_script(
                      '\n'.join(dnd_script),
                      source_el._element,
                      destination_el._element
                  )
  
              except Exception as e:
                  self.error_log(u'drag_and_drop exception: %s' % str(e))
                  raise
          else:
              try:
                  ActionChains(self._driver).drag_and_drop(
                      source_el,
                      destination_el
                  ).perform()
              except Exception as e:
                  self.error_log(u'drag_and_drop exception: %s' % str(e))
                  raise