damnedvi 发表于 2025-5-28 23:03:55

Chromium内核版本会影响脚本执行???!!!

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

```

王一之 发表于 2025-5-29 10:10:45

可能是因为切换标签的原因,浏览器有限制的,如果标签在后台,好像是不能用脚本操作播放视频

damnedvi 发表于 2025-5-29 11:51:16

王一之 发表于 2025-5-29 10:10
可能是因为切换标签的原因,浏览器有限制的,如果标签在后台,好像是不能用脚本操作播放视频 ...

大部分课程是能打开并且播放的,有几个会卡在查找元素那,就感觉代码不动了。后面试了别的浏览器,高版本的就会出现,低版本的没有。

王一之 发表于 2025-5-29 11:52:00

damnedvi 发表于 2025-5-29 11:51
大部分课程是能打开并且播放的,有几个会卡在查找元素那,就感觉代码不动了。后面试了别的浏览器,高版本 ...

你可以看看控制台中有没有报错

可能会有一个安全报错,限制播放

damnedvi 发表于 2025-5-29 14:58:48

王一之 发表于 2025-5-29 11:52
你可以看看控制台中有没有报错

可能会有一个安全报错,限制播放

谢谢,我再研究研究

李恒道 发表于 2025-5-29 22:36:34

如果iframe在浏览器上会有性能压制
在后台无法加载
如果是网课技术栈老很有可能是这个原因

damnedvi 发表于 2025-5-30 08:27:13

李恒道 发表于 2025-5-29 22:36
如果iframe在浏览器上会有性能压制
在后台无法加载
如果是网课技术栈老很有可能是这个原因 ...

虽然不理解您说的这个情况,{:4_104:}    还是要谢谢
页: [1]
查看完整版本: Chromium内核版本会影响脚本执行???!!!