openAny

精细控制版

// 模拟点击
// 调用方式
// 选择符必须全局唯一
// sleep和wait可人选其一,wait优先
// 极个别情况wait有问题时可选择sleep
// 不支持滚动加载的情况
// openAny([{click:"selector", wait:"selector"}, sleep:100], ...);
/* 或
    try {
        openAny([{click:"selector", wait:"selector"}, sleep:100], ...);
    } catch(e) {
        console.log(e);
    }
*/
// 打开设置
// openAny([{click:'#barWorkspace', await:'[data-id="config"]'},{click:'[data-id="config"]'}])
(async ()=>{
    window.openAny = openAny;
    async function openAny(steps = [], stepCallback) {
        for(const step of steps) {
            if(!step.click) throw new Error('缺少点击选中符');
            // 模拟点击
            const stepEl = document.querySelector(step.click);
            stepEl.click();
            // 等待元素出现
            if(step.wait) {
                try {
                    await whenElementExist(step.wait);
                } catch(e) {
                    throw new Error(e);
                }
            } else if(step.sleep) {
                await sleep(parseInt(step.sleep));
            } else {
                await sleep(100);
            }
            // setp回调
            if(typeof stepCallback === 'function') await stepCallback();
        }
    }

    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
  
    function whenElementExist(selector, node, timeout = 5000) {
        return new Promise((resolve, reject) => {
            let isResolved = false;
            const check = () => {
                const el = typeof selector==='function'?selector():(node||document).querySelector(selector);
                if (el) {isResolved = true; resolve(el);} else if(!isResolved) requestAnimationFrame(check);
            };
            check();
            setTimeout(() => {
                if (!isResolved) {
                    reject(new Error(`Timeout: Element not found for selector "${selector}" within ${timeout}ms`));
                }
            }, timeout);
        });
    }
})();

image.png

留下你的脚步
推荐阅读