123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- /* eslint-disable consistent-return, no-param-reassign */
- import simulateEvent from '@/utils/simulate-event';
- import handleFormElement from '@/utils/handle-form-element';
- function markElement(el, { id, data }) {
- if (data.markEl) {
- el.setAttribute(`block--${id}`, '');
- }
- }
- function handleElement({ data, id }, callback, errCallback) {
- if (!data || !data.selector) return null;
- try {
- const blockIdAttr = `block--${id}`;
- const selector = data.markEl
- ? `${data.selector.trim()}:not([${blockIdAttr}])`
- : data.selector;
- const element = data.multiple
- ? document.querySelectorAll(selector)
- : document.querySelector(selector);
- if (typeof callback === 'boolean' && callback) return element;
- if (data.multiple) {
- element.forEach((el) => {
- markElement(el, { id, data });
- callback(el);
- });
- } else if (element) {
- markElement(element, { id, data });
- callback(element);
- } else if (errCallback) {
- errCallback();
- }
- } catch (error) {
- console.error(error);
- }
- }
- export function switchTo(block) {
- return new Promise((resolve) => {
- handleElement(
- block,
- (element) => {
- if (element.tagName !== 'IFRAME') {
- resolve('');
- return;
- }
- resolve({ url: element.src });
- },
- () => {
- resolve('');
- }
- );
- });
- }
- export function eventClick(block) {
- return new Promise((resolve) => {
- handleElement(block, (element) => {
- element.click();
- });
- resolve('');
- });
- }
- export function getText(block) {
- return new Promise((resolve) => {
- let regex;
- const { data } = block;
- const textResult = [];
- if (data.regex) {
- regex = new RegExp(data.regex, data.regexExp.join(''));
- }
- handleElement(block, (element) => {
- let text = element.innerText;
- if (regex) text = text.match(regex).join(' ');
- textResult.push(text);
- });
- resolve(textResult);
- });
- }
- function incScrollPos(element, data, vertical = true) {
- let currentPos = vertical ? element.scrollTop : element.scrollLeft;
- if (data.incY) {
- currentPos += data.scrollY;
- } else if (data.incX) {
- currentPos += data.scrollX;
- }
- return currentPos;
- }
- const automaScript = `
- function automaNextBlock(data) {
- window.dispatchEvent(new CustomEvent('__automa-next-block__', { detail: data }));
- }
- function automaResetTimeout() {
- window.dispatchEvent(new CustomEvent('__automa-reset-timeout__'));
- }
- `;
- export function javascriptCode(block) {
- return new Promise((resolve) => {
- const isScriptExists = document.getElementById('automa-custom-js');
- const scriptAttr = `block--${block.id}`;
- if (isScriptExists && isScriptExists.hasAttribute(scriptAttr)) {
- resolve('');
- return;
- }
- const script = document.createElement('script');
- let timeout;
- script.setAttribute(scriptAttr, '');
- script.id = 'automa-custom-js';
- script.innerHTML = `${automaScript} ${block.data.code}`;
- window.addEventListener('__automa-next-block__', ({ detail }) => {
- clearTimeout(timeout);
- script.remove();
- resolve(detail || {});
- });
- window.addEventListener('__automa-reset-timeout__', () => {
- clearTimeout(timeout);
- timeout = setTimeout(() => {
- script.remove();
- resolve('');
- }, block.data.timeout);
- });
- document.body.appendChild(script);
- timeout = setTimeout(() => {
- script.remove();
- resolve('');
- }, block.data.timeout);
- });
- }
- export function elementScroll(block) {
- return new Promise((resolve) => {
- const { data } = block;
- const behavior = data.smooth ? 'smooth' : 'auto';
- handleElement(block, (element) => {
- if (data.scrollIntoView) {
- element.scrollIntoView({ behavior, block: 'center' });
- } else {
- element.scroll({
- behavior,
- top: data.incY ? incScrollPos(element, data) : data.scrollY,
- left: data.incX ? incScrollPos(element, data, false) : data.scrollX,
- });
- }
- });
- window.dispatchEvent(new Event('scroll'));
- resolve('');
- });
- }
- export function attributeValue(block) {
- return new Promise((resolve) => {
- const result = [];
- handleElement(block, (element) => {
- const value = element.getAttribute(block.data.attributeName);
- result.push(value);
- });
- resolve(result);
- });
- }
- export function forms(block) {
- return new Promise((resolve) => {
- const { data } = block;
- const elements = handleElement(block, true);
- if (data.multiple) {
- const promises = Array.from(elements).map((element) => {
- return new Promise((eventResolve) => {
- markElement(element, block);
- handleFormElement(element, data, eventResolve);
- });
- });
- Promise.allSettled(promises).then(() => {
- resolve('');
- });
- } else if (elements) {
- markElement(elements, block);
- handleFormElement(elements, data, resolve);
- } else {
- resolve('');
- }
- });
- }
- export function triggerEvent(block) {
- return new Promise((resolve) => {
- const { data } = block;
- handleElement(block, (element) => {
- simulateEvent(element, data.eventName, data.eventParams);
- });
- resolve(data.eventName);
- });
- }
- export function link(block) {
- return new Promise((resolve) => {
- const element = document.querySelector(block.data.selector);
- if (!element) {
- resolve('');
- return;
- }
- const url = element.href;
- if (url) window.location.href = url;
- resolve(url);
- });
- }
- export function elementExists({ data }) {
- return new Promise((resolve) => {
- let trying = 0;
- function checkElement() {
- if (trying >= (data.tryCount || 1)) {
- resolve(false);
- return;
- }
- const element = document.querySelector(data.selector);
- if (element) {
- resolve(true);
- } else {
- trying += 1;
- setTimeout(checkElement, data.timeout || 500);
- }
- }
- checkElement();
- });
- }
|