精细控制版
// 模拟点击
// 调用方式
// 选择符必须全局唯一
// 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);
});
}
})();
