UNPKG

@luminati-io/webdriverio8

Version:

Next-gen browser and mobile automation test framework for Node.js

51 lines 4.62 kB
import { getBrowserObject } from '../../utils/index.js'; /** * * Move the mouse by an offset of the specified element. If no element is specified, * the move is relative to the current mouse cursor. If an element is provided but * no offset, the mouse will be moved to the center of the element. If the element * is not visible, it will be scrolled into view. * * @param {MoveToOptions=} options moveTo command options * @param {Number=} options.xOffset X offset to move to, relative to the top-left corner of the element. If not specified, the mouse will move to the middle of the element. * @param {Number=} options.yOffset Y offset to move to, relative to the top-left corner of the element. If not specified, the mouse will move to the middle of the element. * * @see https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessionidmoveto * @type protocol */ export async function moveTo({ xOffset, yOffset } = {}) { if (!this.isW3C) { return this.moveToElement(this.elementId, xOffset, yOffset); } /** * W3C way of handle the mouse move actions */ const browser = getBrowserObject(this); if (xOffset || yOffset) { const { width, height } = await browser.getElementRect(this.elementId); if ((xOffset && xOffset < (-Math.floor(width / 2))) || (xOffset && xOffset > Math.floor(width / 2))) { throw new Error('xOffset would cause a out of bounds error as it goes outside of element'); } if ((yOffset && yOffset < (-Math.floor(height / 2))) || (yOffset && yOffset > Math.floor(height / 2))) { throw new Error('yOffset would cause a out of bounds error as it goes outside of element'); } } const moveToNested = async () => { await browser.action('pointer', { parameters: { pointerType: 'mouse' } }) .move({ origin: this, x: xOffset || 0, y: yOffset || 0 }) .perform(); }; try { await moveToNested(); } catch { /** * Workaround, because sometimes browser.action().move() flaky and isn't able to scroll pointer to into view * Moreover the action with 'nearest' behavior by default where element is aligned at the bottom of its ancestor. * and could be overlapped. Scroll to center should definitely work even if element was covered with sticky header/footer */ await this.scrollIntoView({ block: 'center', inline: 'center' }); await moveToNested(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92ZVRvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2VsZW1lbnQvbW92ZVRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBT3ZEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE1BQU0sQ0FFeEIsRUFBRSxPQUFPLEVBQUUsT0FBTyxLQUFvQixFQUFFO0lBRXhDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUNEOztPQUVHO0lBQ0gsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEMsSUFBSSxPQUFPLElBQUksT0FBTyxFQUFFLENBQUM7UUFDckIsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3RFLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRyxNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxDQUFDLENBQUE7UUFDOUYsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwRyxNQUFNLElBQUksS0FBSyxDQUFDLHlFQUF5RSxDQUFDLENBQUE7UUFDOUYsQ0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLFlBQVksR0FBRyxLQUFLLElBQUksRUFBRTtRQUM1QixNQUFNLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7YUFDcEUsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO2FBQ3hELE9BQU8sRUFBRSxDQUFBO0lBQ2xCLENBQUMsQ0FBQTtJQUNELElBQUksQ0FBQztRQUNELE1BQU0sWUFBWSxFQUFFLENBQUE7SUFDeEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNMOzs7O1VBSUU7UUFDRixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQ2hFLE1BQU0sWUFBWSxFQUFFLENBQUE7SUFDeEIsQ0FBQztBQUNMLENBQUMifQ==