刚写了个某网络学院的视频课程学习脚本,代码比较简单,开始在edge浏览器上执行一直不顺畅,脚本经常出现卡滞现象(应该不是脚本出错),单纯卡那不动,切换下标签页代码又活了。换到360浏览器上,Chromium内核版本比较低,就很顺畅,没有任何问题。下面是主要代码,就是简单的找元素,点击,播放之类的,本人初学者,代码写得比较乱,大家勿喷😌

class Runner {
static getNode(selector, type = 'node', dom, timeout = 5000) {
return new Promise((resolve, reject) => {
if (!['node', 'nodeList'].includes(type)) {
console.error('第二个参数type请选择 "node" or "nodeList"');
reject('第二个参数type请选择 "node" or "nodeList"');
}
const cleanup = (timeoutId, intervalId) => {
clearTimeout(timeoutId);
clearInterval(intervalId);
};
const handleSuccess = (result, timeoutId, intervalId) => {
console.log(`${selector} ready!`);
cleanup(timeoutId, intervalId);
resolve(result);
};
const handleFailure = (timeoutId, intervalId) => {
cleanup(timeoutId, intervalId);
resolve(null);
};
const checkNode = () => {
try {
let nodes;
if (type === 'node') {
nodes = dom ? dom.querySelector(selector) : document.querySelector(selector);
return nodes
}
nodes = dom ? dom.querySelectorAll(selector) : document.querySelectorAll(selector);
return nodes.length > 0 ? nodes : null;
} catch (error) {
console.error('节点查找错误:', error);
reject('节点查找错误:', error)
}
};
const intervalId = setInterval(() => {
const result = checkNode();
if (result) {
handleSuccess(result, timeoutId, intervalId);
} else {
console.log(`等待节点: ${selector}...`);
}
}, 1000);
const timeoutId = setTimeout(() => {
console.error(`获取节点超时: ${selector}`);
handleFailure(timeoutId, intervalId);
}, timeout);
});
}
async runAllCourses() {
// const originalWindow = window;
var pageNumbers = await Runner.getNode('.number', 'nodeList')
for (let j = 0; j < pageNumbers.length; j++) {
pageNumbers[j].click()
var courseElements = await Runner.getNode('.myCol4', 'nodeList')
console.log(courseElements.length)
for (let i = 0; i < courseElements.length; i++) {
debugger
try {
const courseCard = courseElements[i].querySelector('.courseCard')
const percentage = courseCard.__vue__._props.item.percentage
const courseId = courseCard.__vue__._props.item.id
console.log('percentage', percentage)
if (percentage >= 100) continue
const courseUrl = `https://**************/courseDetailsNew?id=${courseId}&coursewareType=0`
const newTab = window.open(courseUrl)
var duration = 0
const detailPage = await Runner.getNode('.detailPage', 'node', newTab.document)
const studyBtn = await Runner.getNode('.myBtn.selected', 'node', newTab.document)
duration = parseInt(detailPage.__vue__.courseware.duration)
console.log('duration', duration)
studyBtn.click()
const chooseLink = await Runner.getNode('.choose-content', 'node', newTab.document) //您当前已有正在播放(或未正常关闭)的课件或文章,请点击下方您要学习的课件:
if (chooseLink) chooseLink.click()
var video = await Runner.getNode('video', 'node', newTab.document);
if (video) {
video.playbackRate = 1
// debugger
video.volume = 0
video.muted = true
if (video.paused) {
video.play()
}
video.addEventListener('play', function () {
});
await sleep((100 - percentage) / 100 * duration * 60 * 1000)
// await sleep(6 * 1000)
if (newTab) newTab.close()
// console.log('end---------------------')
}
} catch (err) {
console.log(err)
continue
}
}
}
}
}
const sleep = function (time) {
return new Promise(resolve => setTimeout(resolve, time));
}