前言

学校在智慧树平台安排有课程,我不想学但不得不学,就这么简单。(这种大逆不道的话你也敢说的吗兄嘚)。

啊哈哈哈,那当然不是了。我是热爱学习,渴望用知识的力量武装自己的当代油锈大学生,学校为我们提供了如此精良的课程,我们当然不能辜负学校的良苦用心才是啊。

可是!可是!某人听课有个习惯,一定是全神贯注仔细听讲。因为哪怕只有一点点外界干扰,都会影响整体的心流状态,如果因为这个原因,影响了学习掌握新知识的效率,那真的会痛心不已(脸皮是真的厚)。

请诸位试想,你正津津有味地聆听网课老师的绝妙理论,沉浸其中无法自拔时,突然,跳出来一个弹窗暂停了视频播放,中断了你的听课状态,要求你答题,答完题才能接着看,你说说,这不是欺负老实人吗。我就想安安静静听课,课后练习题,你等我听完课再让去做不好么。真的是,猴猴急。

还有还有,你看完一节网课,掌握了更多新知识的同时,心中多多少少也有更多的疑惑,迫切想听接下来的课程,从中获取到你想要的答案。可惜智慧树它偏不,它在播放完一节网课之后竟然不能自动播放下一个视频。连这样简单的自动连播都不给实现,这我不能忍了。既然如此,那就由我来“调教”一下。

那需求就是:首先,应该“跳过”视频播放过程中出现的问题小弹窗,然后,实现视频自动连播功能。

直接安排!

实现

#导入需要的库
from selenium import webdriver                                      #selenium库,核心库,webdriver对象用来操作浏览器
from selenium.webdriver.common.by import By                         #用于定位页面元素
from selenium.webdriver.common.action_chains import ActionChains    #处理鼠标事件(如鼠标悬停等)
from time import sleep                                              #time标准库,用于程序休眠

设定一些启动参数,比如关闭Selenium的控制台日志,让控制台清爽一点。

options = webdriver.EdgeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])  #关闭selenium日志输出
options.add_argument("--mute-audio")                                    #浏览器静音
Edge = webdriver.Edge(options=options)                                  #创建webdriver对象Edge.implicitly_wait(10)                                            #设定全局等待时间,10秒

接下来,用代码打开智慧树官网主页,检查【登录】的元素,很棒啊!智慧树很给面子地用一个id标识了登录按钮。那我们要实现模拟点击【登录】,只需要用这个id在Selenium中定位就好了。

写个死循环,让程序一直检测视频播放页面的元素。如果检测到并能成功点击,说明用户已经顺利进入了视频播放界面。为什么要用死循环呢?因为当我们模拟点击登录之后,智慧树跳转进入用户登录页面等待用户登录。而用户什么时候登录完成,并进入视频播放界面,我们是不能确定的。但是后续代码必须保证当前页面在视频播放页面才能继续执行,所以写一个死循环,当条件满足时用break退出去,正常执行后续代码。什么?你问我如果用户迟迟不等登录,或者用户操作不当,没有进入视频播放界面怎么办?怎么办,简单啊,让它一直死循环就好了,直到用户进入了正确的页面,这样可以规避了因用户操作问题导致的程序崩溃。

直到用户进入视频播放页面,我们在视频播放页面找个元素,这个元素要保证,一旦循环找到了这个元素,就确实能证明我进入了这个页面,可以退出循环执行后续代码。我找的元素是这个。

智慧树还是很温柔地,用一个class标识了这个元素,我们还是可以很轻易地定位到它。代码如下。

Edge.get("http://www.zhihuishu.com/")                                   #打开知到智慧树官网
Edge.find_element(By.ID,"notLogin").click()                             #定位到【登录】while True:                                                         #等待用户登录、进入课程try:Edge.find_element(By.CLASS_NAME,"hint_delete").click()except:print("未找到课程")else:break

okk,到了这里,万事俱备,可以着手实现功能了。首先。要实现自动播放下一个视频,需要知道当前课程总共有多少视频、现在已经看完的视频有几个。

通过查找页面元素我们发现,智慧树将每一个视频统一用一个class标识,所以我们只需要用.find_elements()方法,这个方法返回一个列表,能获取到所有指定特征的元素,那么这个列表的长度,就是课程数量。同理,智慧树将以看完的课程后面标识了一个小图标,我们只需要获取到这个小图标的个数,就能得到已经看完的课程数量。

代码如下:

icofinishlist = Edge.find_elements(By.CLASS_NAME,"fl.time_icofinish")   #存放已完成的课程,列表
Allvideolist = Edge.find_elements(By.CLASS_NAME,"clearfix.video")    #存放全部课程,列表
Allvideolist[len(icofinishlist)].click()                             #进入未完成的第一个课程

说到这里,我想应该能够体会selenium定位元素的方法了吧。后面的代码部分原理还是一样的,找元素,点击元素就好了,元素的特征定位也很简单,基本上全是通过class就能定位。直接贴代码:

sleep(5)
videoArea = Edge.find_element(By.CLASS_NAME,"videoArea")                #视频播放区域
ActionChains(Edge).move_to_element(videoArea).perform()                 #鼠标悬停
speedBox = Edge.find_element(By.CLASS_NAME,"speedBox")                  #视频倍速按钮
ActionChains(Edge).move_to_element(speedBox).perform()                  #鼠标悬停
Edge.find_element(By.CLASS_NAME,"speedTab.speedTab15").click()          #视频1.5倍速
definiBox = Edge.find_element(By.CLASS_NAME,"definiBox")                #视频清晰度按钮
ActionChains(Edge).move_to_element(definiBox).perform()                 #鼠标悬停
Edge.find_element(By.CLASS_NAME,"line1bq.switchLine").click()           #视频【流畅】清晰度
Edge.find_element(By.ID,"playButton").click()                           #视频播放按钮
while True:                                                             #循环,检测小弹窗try:Edge.find_elements(By.CLASS_NAME,"topic-item")[0].click()       #小弹窗选项,默认选第一个(A)except:print("未检测到小测验弹窗")else:print("检测到小测验弹窗")btn1 = Edge.find_element(By.CLASS_NAME,"el-dialog__wrapper.dialog-test")btn2 = btn1.find_element(By.CLASS_NAME,"el-dialog")btn3 = btn2.find_element(By.CLASS_NAME,"el-dialog__headerbtn").click()sleep(3)videoArea = Edge.find_element(By.CLASS_NAME,"videoArea")        #视频播放区域ActionChains(Edge).move_to_element(videoArea).perform()         #鼠标悬停Edge.find_element(By.ID,"playButton").click()                   #重新播放视频break

关于代码中鼠标悬停那部分,是因为智慧树的视频播放界面,播放、调整倍速、调整清晰度等等这些控件,是要用户先将鼠标悬停到视频播放区域才会可见的。于是我们用Selenium提供的ActionChains类模拟鼠标操作,实现悬停。然后是死循环,不停检查视频内小弹窗元素。当弹窗出现时,随便点击一个问题的答案,关闭小弹窗就可以了。这样第一个功能:“跳过”视频内小弹窗,就这样实现了。

接下来用一个大循环,不断检查现在已经看完的视频列表(也就是能代表视频已经看完的那个小图标)有没有新增。如果有新增,说明当前视频已经播放完毕了,可以进入下一个视频了。这样就实现了自动连播,代码如下:

while True:Nowicofinish = Edge.find_elements(By.CLASS_NAME,"fl.time_icofinish")if len(Nowicofinish) == len(icofinishlist)+1:icofinishlist = Edge.find_elements(By.CLASS_NAME,"fl.time_icofinish")       #更新已完成的课程,列表Allvideolist[len(icofinishlist)].click()                                    #进入下一个未完成的课程print("进入下一课")

后记

我对selenium的理解就是,定位元素,然后操作元素。定位元素很简单,在网页页面用开发者工具检查元素,然后根据元素的一系列相关特征,在代码中用selenium提供的方法,定位到你指定的元素,操作它就好了。但是说者简单,真正实操起来,还是有各种问题和难度的。好在智慧树这个网页比较“温柔”,没有设定什么让人麻烦的东西,新手在掌握selenium基本语法之后,也大可以用这个平台练练手。(智慧树:你礼貌吗)。

实现方法其实很粗糙,而且局限性很大。但是无所谓啦,只是想通过它练练手。

感谢你能看到这里!

Selenium实战应用——实现知到智慧树自动播放课程相关推荐

  1. python123第九周测验答案2020_知到智慧树2020艺术概论章节测验答案

    知到智慧树2020艺术概论章节测验答案 更多相关问题 [判断题]机械温控冰箱可以存放易燃易爆的化学品.[多选题]1.网络销售促进策略有( )[判断题]全面坚持和正确处理 "-个中心.两个基本 ...

  2. python解释器环境中用于表示上一次运算结果的特殊变量_知到智慧树_中国画基础_作业题库答案...

    知到智慧树_中国画基础_作业题库答案 更多相关问题 消费者在举行婚礼时穿正式礼服,而在酒吧穿休闲套装,这是因为()情境不同. (内毒素)的主要成分是 ()一般由革兰氏阴性菌产生,是细胞壁中的成份.只有 ...

  3. python逐笔输入数据_知到智慧树Python数据分析与数据可视化结课测验

    知到智慧树Python数据分析与数据可视化结课测验答案 更多相关问题 已知三角形三个顶点的坐标是A(-1,2,3),B(1,1,1),C(0,0,5),试证三角形ABC是直角三角形,并求角B-- Wh ...

  4. mysql数据库设计与应用答案智慧树_知到智慧树_MySQL数据库设计与应用_答案完整...

    知到智慧树_MySQL数据库设计与应用_答案完整 更多相关问题 [B11]A.carry onB.linger onC.set inD.log in 数据库的三级模式结构中,模式也称为A.逻辑模式B. ...

  5. 大数据可视化陈为智慧树_知到智慧树_大数据可视化_大学课后答案

    知到智慧树_大数据可视化_大学课后答案 更多相关问题 用下列方法不能将NaCl和Na2CO3两种溶液区分开的是()A.向两种溶液中分别滴加醋酸B.向两种溶液中分别滴加稀硫 为了除去KCl中少量的MgS ...

  6. his使用mysql_知到智慧树_MySQL数据库设计与应用_答案全部

    知到智慧树_MySQL数据库设计与应用_答案全部 更多相关问题 He was crossing over to _____ side of the road when I saw him. A.oth ...

  7. 大数据可视化陈为智慧树_知到智慧树大数据可视化2020见面课答案

    知到智慧树大数据可视化2020见面课答案 更多相关问题 What\'s the original name of Mark Twain? What impresses Prof. Lv most in ...

  8. python智慧树判断题_知到智慧树_Python程序设计基础_判断题答案

    知到智慧树_Python程序设计基础_判断题答案 更多相关问题 [问答题,简答题] 简述安全门升压试验的方法. [问答题,简答题] 简述热力除氧的基本条件. [问答题,简答题] 简答汽轮机组停机后造成 ...

  9. python利用selenium库(WEB自动化)完成智慧树自动刷题

    这里用的是Chrome浏览器,使用selenium库是需要先安装Chrome的驱动 分析: selenium库能实现网页自动操作,智慧树每次学习完一小节后都需要点击下一节视频.这里我检测了视频的总播放 ...

  10. 知到智慧树python答案2020_参考答案2020智慧树(知到)Python程序设计

    参考答案2020智慧树(知到)Python程序设计 更多相关问题 水池满水试验时,正确的注水方法是(). A. 相邻两次注水间隔时间不应少于48h B. 注水分三次 米跨度的起重机是标准起重机.A.1 ...

最新文章

  1. 概述:机器学习和大数据技术在信贷风控场景中的应用
  2. ConfigParser配置文件
  3. es6对象属性的遍历
  4. Iptables Layer7禁止QQ、MSN、p2p软件(解决iptable 无法启动)
  5. html引入vue不兼容ie11,关于vue.js:iview按需引入ie11不兼容报无效字符问题解决
  6. NSLayoutConstraint 使用详解 VFL使用介绍
  7. messagehub讲解,如何获取MessageHub的其余管理API的API密钥?
  8. Pwn2Own黑客大赛战况:iPhone 20秒被黑
  9. Gstreamer之GstBuffer(十八)
  10. linux 7种网卡绑定模式,七种网卡绑定模式详解
  11. SmartGit for Mac(图形化Git客户端)
  12. java word 在线编辑图片,_卓正软件 - PageOffice官方网站 - 在线编辑Word、Excel的Office文档控件...
  13. EasyUI给databox,timebox赋予当前时间
  14. win10操作系统创建局域网共享文件夹
  15. php excel 设置下拉菜单,phpexcel setFormula下拉选择列表 序列
  16. socket编程(在线自动聊天工具) --Python3
  17. 【JavaEE】JavaScript(WebAPI)
  18. 看待一件事,从不喜欢再到喜欢,转变需要多大
  19. html车票查询表单,火车票订单查询系统
  20. 计算机毕业设计Node.js+Express智慧工地管理系统(源码+程序+lw+远程调试)

热门文章

  1. 昆石VOS2009/VOS3000 2.1.6.00 新功能介绍目录
  2. 策略模式详解(用java语言实现策略模式)
  3. 基于Androidstudio的2048小游戏的设计与实现
  4. 电子元器件自动测试系统
  5. 电子元器件晶体二极管的识别和检测注意事项
  6. cadence 17.2入门学习1
  7. Python编曲实践(十):用Ableton Live 10手工扒的Grunge摇滚数据集,涵盖Grunge时期四大代表乐队的经典专辑
  8. [开源项目]_[C++ CSDN博客下载-CSDN博客导出-CSDN博客备份工具]
  9. JEP JAVA 初体验
  10. 对Gamma校正的理解