UNPKG

@luminati-io/webdriverio8

Version:

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

97 lines 9.46 kB
import logger from '@wdio/logger'; import { ELEMENT_KEY } from '../../constants.js'; import { getBrowserObject } from '../../utils/index.js'; const log = logger('webdriverio'); function scrollIntoViewWeb(options = { block: 'start', inline: 'nearest' }) { const browser = getBrowserObject(this); return browser.execute((elem, options) => elem.scrollIntoView(options), { [ELEMENT_KEY]: this.elementId, // w3c compatible ELEMENT: this.elementId, // jsonwp compatible }, options); } /** * * Scroll element into viewport ([MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView)). * * <example> :scrollIntoView.js it('should demonstrate the scrollIntoView command', async () => { const elem = await $('#myElement'); // scroll to specific element await elem.scrollIntoView(); // center element within the viewport await elem.scrollIntoView({ block: 'center', inline: 'center' }); }); * </example> * * @alias element.scrollIntoView * @param {object|boolean=} scrollIntoViewOptions options for `Element.scrollIntoView()` (default: `{ block: 'start', inline: 'nearest' }`) * @uses protocol/execute * @type utility * */ export async function scrollIntoView(options = { block: 'start', inline: 'nearest' }) { const browser = getBrowserObject(this); /** * Appium does not support the "wheel" action */ if (browser.isMobile) { return scrollIntoViewWeb.call(this, options); } try { /** * by default the WebDriver action scrolls the element just into the * viewport. In order to stay complaint with `Element.scrollIntoView()` * we need to adjust the values a bit. */ const elemRect = await browser.getElementRect(this.elementId); const viewport = await browser.getWindowSize(); let [scrollX, scrollY] = await browser.execute(() => [ window.scrollX, window.scrollY ]); // handle elements outside of the viewport scrollX = elemRect.x <= viewport.width ? elemRect.x : viewport.width / 2; scrollY = elemRect.y <= viewport.height ? elemRect.y : viewport.height / 2; const deltaByOption = { start: { y: elemRect.y - elemRect.height, x: elemRect.x - elemRect.width }, center: { y: elemRect.y - Math.round((viewport.height - elemRect.height) / 2), x: elemRect.x - Math.round((viewport.width - elemRect.width) / 2) }, end: { y: elemRect.y - (viewport.height - elemRect.height), x: elemRect.x - (viewport.width - elemRect.width) } }; let [deltaX, deltaY] = [deltaByOption.start.x, deltaByOption.start.y]; if (options === true) { options = { block: 'start', inline: 'nearest' }; } if (options === false) { options = { block: 'end', inline: 'nearest' }; } if (options && typeof options === 'object') { const { block, inline } = options; if (block === 'nearest') { const nearestYDistance = Math.min(...Object.values(deltaByOption).map(delta => delta.y)); deltaY = Object.values(deltaByOption).find(delta => delta.y === nearestYDistance).y; } else if (block) { deltaY = deltaByOption[block].y; } if (inline === 'nearest') { const nearestXDistance = Math.min(...Object.values(deltaByOption).map(delta => delta.x)); deltaX = Object.values(deltaByOption).find(delta => delta.x === nearestXDistance).x; } else if (inline) { deltaX = deltaByOption[inline].x; } } // take into account the current scroll position deltaX = Math.round(deltaX - scrollX); deltaY = Math.round(deltaY - scrollY); await browser.action('wheel') .scroll({ duration: 0, x: deltaX, y: deltaY, origin: this }) .perform(); } catch (err) { log.warn(`Failed to execute "scrollIntoView" using WebDriver Actions API: ${err.message}!\n` + 'Re-attempting using `Element.scrollIntoView` via Web API.'); await scrollIntoViewWeb.call(this, options); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsSW50b1ZpZXcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvZWxlbWVudC9zY3JvbGxJbnRvVmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxjQUFjLENBQUE7QUFFakMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBRXZELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQUVqQyxTQUFTLGlCQUFpQixDQUV0QixVQUEyQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUVoRixNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN0QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQ2xCLENBQUMsSUFBaUIsRUFBRSxPQUF3QyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUM3RjtRQUNJLENBQUMsV0FBVyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxpQkFBaUI7UUFDaEQsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsb0JBQW9CO0tBQzFCLEVBQ3ZCLE9BQU8sQ0FDVixDQUFBO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYyxDQUVoQyxVQUEyQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUVoRixNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUV0Qzs7T0FFRztJQUNILElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ25CLE9BQU8saUJBQWlCLENBQUMs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