Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 48x 4x 2x 2x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | /**
*
* Drag an item to a destination element.
*
* @alias element.dragAndDrop
* @param {Element} target destination selector
* @param {Number=} duration how long the drag should take place
* @uses action/moveToObject, protocol/buttonDown, protocol/buttonUp, property/getLocation, protocol/touchDown, protocol/touchMove, protocol/touchUp
* @type action
*
*/
import { getElementRect } from '../../utils'
const ACTION_BUTTON = 0
export default async function dragAndDrop (target, duration = 100) {
if (!target || target.constructor.name !== 'Element') {
throw new Error('command dragAndDrop requires an WebdriverIO Element as first parameter')
}
if (!this.isW3C) {
await this.moveTo()
await this.buttonDown(ACTION_BUTTON)
await target.moveTo()
return this.buttonUp(ACTION_BUTTON)
}
/**
* get coordinates to drag and drop
*/
const sourceRect = await getElementRect(this)
const targetRect = await getElementRect(target)
const sourceX = parseInt(sourceRect.x + (sourceRect.width / 2), 10)
const sourceY = parseInt(sourceRect.y + (sourceRect.height / 2), 10)
const targetX = parseInt(targetRect.x + (targetRect.width / 2), 10) - sourceX
const targetY = parseInt(targetRect.y + (targetRect.height / 2), 10) - sourceY
/**
* W3C way of handle the drag and drop action
*/
return this.performActions([{
type: 'pointer',
id: 'finger1',
parameters: { pointerType: 'mouse' },
actions: [
{ type: 'pointerMove', duration: 0, x: sourceX, y: sourceY },
{ type: 'pointerDown', button: ACTION_BUTTON },
{ type: 'pause', duration: 10 }, // emulate human pause
{ type: 'pointerMove', duration, origin: 'pointer', x: targetX, y: targetY },
{ type: 'pointerUp', button: ACTION_BUTTON }
]
}]).then(() => this.releaseActions())
}
|