create gestures helper
This commit is contained in:
parent
08615d25dd
commit
b9e230fcc8
|
@ -0,0 +1,119 @@
|
||||||
|
import { RectReturn } from '@wdio/protocols/build/types';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To make a Gesture methods more robust for multiple devices and also
|
||||||
|
* multiple screen sizes the advice is to work with percentages instead of
|
||||||
|
* actual coordinates. The percentages will calculate the position on the
|
||||||
|
* screen based on the SCREEN_SIZE which will be determined once if needed
|
||||||
|
* multiple times.
|
||||||
|
*/
|
||||||
|
|
||||||
|
let SCREEN_SIZE: RectReturn;
|
||||||
|
interface XY {
|
||||||
|
x: number;
|
||||||
|
y: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The values in the below object are percentages of the screen
|
||||||
|
*/
|
||||||
|
const SWIPE_DIRECTION = {
|
||||||
|
down: {
|
||||||
|
start: { x: 50, y: 15 },
|
||||||
|
end: { x: 50, y: 85 }
|
||||||
|
},
|
||||||
|
left: {
|
||||||
|
start: { x: 95, y: 50 },
|
||||||
|
end: { x: 5, y: 50 }
|
||||||
|
},
|
||||||
|
right: {
|
||||||
|
start: { x: 5, y: 50 },
|
||||||
|
end: { x: 95, y: 50 }
|
||||||
|
},
|
||||||
|
up: {
|
||||||
|
start: { x: 50, y: 85 },
|
||||||
|
end: { x: 50, y: 15 }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
async function swipe(from: XY, to: XY) {
|
||||||
|
await driver.performActions([
|
||||||
|
{
|
||||||
|
// a. Create the event
|
||||||
|
type: 'pointer',
|
||||||
|
id: 'finger1',
|
||||||
|
parameters: { pointerType: 'touch' },
|
||||||
|
actions: [
|
||||||
|
// b. Move finger into start position
|
||||||
|
{ type: 'pointerMove', duration: 0, x: from.x, y: from.y },
|
||||||
|
// c. Finger comes down into contact with screen
|
||||||
|
{ type: 'pointerDown', button: 0 },
|
||||||
|
// d. Pause for a little bit
|
||||||
|
{ type: 'pause', duration: 100 },
|
||||||
|
// e. Finger moves to end position
|
||||||
|
// We move our finger from the center of the element to the
|
||||||
|
// starting position of the element.
|
||||||
|
// Play with the duration to make the swipe go slower / faster
|
||||||
|
{ type: 'pointerMove', duration: 1000, x: to.x, y: to.y },
|
||||||
|
// f. Finger gets up, off the screen
|
||||||
|
{ type: 'pointerUp', button: 0 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
// Add a pause, just to make sure the swipe is done
|
||||||
|
await driver.pause(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
function calculateXY({ x, y }: XY, percentage: number): XY {
|
||||||
|
return {
|
||||||
|
x: x * percentage,
|
||||||
|
y: y * percentage
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDeviceScreenCoordinates(screenSize: RectReturn, coordinates: XY): XY {
|
||||||
|
return {
|
||||||
|
x: Math.round(screenSize.width * (coordinates.x / 100)),
|
||||||
|
y: Math.round(screenSize.height * (coordinates.y / 100))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async function swipeOnPercentage(from: XY, to: XY) {
|
||||||
|
// Get the screen size and store it so it can be re-used.
|
||||||
|
// This will save a lot of webdriver calls if this methods is used multiple times.
|
||||||
|
SCREEN_SIZE = SCREEN_SIZE || (await driver.getWindowRect());
|
||||||
|
// Get the start position on the screen for the swipe
|
||||||
|
const pressOptions = getDeviceScreenCoordinates(SCREEN_SIZE, from);
|
||||||
|
// Get the move to position on the screen for the swipe
|
||||||
|
const moveToScreenCoordinates = getDeviceScreenCoordinates(SCREEN_SIZE, to);
|
||||||
|
|
||||||
|
await swipe(pressOptions, moveToScreenCoordinates);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function swipeDown(percentage = 1) {
|
||||||
|
await swipeOnPercentage(calculateXY(SWIPE_DIRECTION.down.start, percentage), calculateXY(SWIPE_DIRECTION.down.end, percentage));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swipe Up based on a percentage
|
||||||
|
*/
|
||||||
|
export async function swipeUp(percentage = 1) {
|
||||||
|
await swipeOnPercentage(calculateXY(SWIPE_DIRECTION.up.start, percentage), calculateXY(SWIPE_DIRECTION.up.end, percentage));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swipe left based on a percentage
|
||||||
|
*/
|
||||||
|
export async function swipeLeft(percentage = 1) {
|
||||||
|
await swipeOnPercentage(calculateXY(SWIPE_DIRECTION.left.start, percentage), calculateXY(SWIPE_DIRECTION.left.end, percentage));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Swipe right based on a percentage
|
||||||
|
*/
|
||||||
|
export async function swipeRight(percentage = 1) {
|
||||||
|
await swipeOnPercentage(
|
||||||
|
calculateXY(SWIPE_DIRECTION.right.start, percentage),
|
||||||
|
calculateXY(SWIPE_DIRECTION.right.end, percentage)
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in New Issue