简单的自动化使用--使用selenium实现学习通网站的刷慕课程序。注释空格加代码大概200行不到
简单的自动化使用--使用selenium实现学习通网站的刷慕课程序。注释空格加代码大概200行不到
相见恨晚啊
github地址
环境Python3.6 + pycharm + chrom浏览器 + chromdriver
依赖库selenium,time,random
- selenium实现自动化控制浏览器
- time和random设置随机的停留时间,使程序更像是人类在控制。
基本思想:使用Python中的selenium库来控制chrom浏览器来刷慕课,而且是模拟人类点击物理,相当于物理外挂。
1.实现模拟登录,选择省份,学校,输入账号,密码,以及验证码。
- 使用selenium库来定义一个chrom实例driver。
- 使用driver来进入登录网址
- 使用driver的findelementby_xpath方法来选取省份,学校(这个因个人而不同的,程序里面是需要更改的。
1.1点击选择单位按钮,会出现各省份和个学校的列表

1.2.右击你所在的省份,点击检查(这里以河南的洛阳理工为例),右侧光标会定位在你所在省份的标签列,

1.3.右击标签-->copy--->copy xpath


1.4.把copy之后的代码复制到从github下载下来的第十四行代码中,即
# 点击河南henan = driver.find_element_by_xpath('要复制的地方')henan.click()
1.5.选择学校,点击左侧列表中的河南,在右侧找到你所在的学校,右击学校点击检查

1.6.在右侧会光标会显示在你所在学校的标签中,右击--->copy-->copy xpath

1.7把复制的代码粘贴到从github下载下来的第22行
# 点击洛阳理工louyang = driver.find_element_by_xpath('要复制的地方')louyang.click()
1.8接下来还要修改的代码部分是你要刷的那个慕课的网址,请确保是下面这个图中的url链接

1.9把整个url复制下来之后要替换的是从github下载下来的代码中的第45行代码,把url复制到下面要替换的位置
# 得到慕课网址get_url = '要替换的地方网址'driver.get(get_url)time.sleep(5)
2.接下来就是运行程序,输入自己的账号密码和网页中的验证码。程序就可以跑起来了,就可以实现物理外挂来刷课。

如果只是想使用这个程序的话,上面的就已经够用了。下载github代码,修改省份,学校,和慕课网址运行程序就可以开启物理外挂来刷慕课了。如果想和我一起来维护这个程序的话,可以看下面的讲解,进一步了解这一程序的运行原理。
3.接下来就是重点,程序实现的原理。首先获取一共有多少个章节,遍历章节,处理网络不稳定,换公网,点击播放按钮,处理答题细节,处理打完题的情况。
3.0 播放器的html代码是在页面下面的ifram中的ifram中的hml代码里面要使用driver的switch_to.frame方法来切换到ifram中去。
- 代码处理
# 切换到下面的iframe里try:driver.switch_to.frame(driver.find_element_by_xpath('//body/div/div/p/div/iframe'))except:driver.switch_to.frame(driver.find_element_by_xpath('//body/div/div/p/span/div/iframe'))
3.1找到所有的章节标签遍历。
所有的章节都在//*[@id="coursetree"]/div里面,使用driver的findelementsby_xpath方法来找到所有标签,获取标签数量,并遍历


3.1从html代码中发现每一个大章节的第一个标签和其他标签不一样,第一章节是在//[@id="coursetree"]/div/div中,而下面的章节是在//[@id="coursetree"]/div中比第一章节少了一个div。可以使用try-except语句来处理先获取点击第一章节或第二章节的标签,出现异常再点击另一个按钮,这个方法可以完美的处理遍历章节中使每一个都可以遍历到
下面是章节不一样的图

下面是处理的代码
# 点击章节try:driver.find_element_by_xpath('//*[@id="coursetree"]/div[' + str(i + 1) + ']').click()except:driver.find_element_by_xpath('//*[@id="coursetree"]/div[' + str(i + 1) + ']/div').click()
3.2点击播放按钮,播放按钮到目前位置发现有两种一种是直接在视频框里面的,另一种要先点击视频切换到视频框,在点击播放按钮。
- 下面是第一种情况直接就可以点击播放按钮

- 下面是第二种情况,要先点视频,再点击播放按钮

- 下面是处理这两种情况的处理逻辑
# 找到播放按钮并点击try:button = driver.find_element_by_xpath('//*[@id="reader"]')button.click()except:driver.find_element_by_xpath('//*[@id="dct2"]').click()driver.find_element_by_xpath('//*[@id="reader"]').click()
3.3处理网络问题,有时候使用本校的网是不行的,会出现网络不佳的问题,所有要使用代码来直接切换到公网按钮,使用代码先点击本校按钮,再点击公网2按钮(直接点击公网2按钮是不行的,实验过了,这些点击的按钮的位置都是通过findelementby_xpath来获取的,和上面方法一样不在多说。)
- 下面是实现代码
# 找到公网try:driver.find_element_by_xpath('//*[@id="video"]/div[4]/div[8]/span').click()driver.find_element_by_xpath('//*[@id="video"]/div[4]/div[8]/div/ul/li[3]/span[1]').click()except:pass
3.4像找到快进按钮啊,静音按钮都是一个办法的。通过findelementby_xpath方法得到并点击。
4.下面处理答题,完成视频,和网络不佳的情况。这些逻辑但是在try-except里面处理的
4.1出现网络不佳时,使用右击--->检查---->右击copy---->copy xpath来获取公网2的标签位置并点击。
# 当网络不可用时 点击公网try:driver.find_element_by_xpath('//*[@id="vjserrdisplay-1035"]/ul/li[2]/label').click()except:pass
4.2出现答题时找到,视频中答题位置,找到选择题选项位置,遍历每一个选项点击,总有一个是正确的(而且这个答案是不影响总成绩的) -代码实现
# 找到视频中出现的答题位置if driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):# 找到选择题button3 = driver.find_elements_by_xpath('//body/div[4]/div/div[7]/span/div/div/ul/li')# print("button3{}", button3)while driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):# print(1)# 对选项进行遍历for button1 in button3:button1 = button1.find_element_by_xpath('label')# print("button1{}", button1)button1.click()time.sleep(random.random() * 3)# 点击提交按钮button5 = driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div/div[2]')# print("button5{}", button5)button5.click()time.sleep(random.random() * 3)if driver.switch_to.alert():al = driver.switch_to.alert()al.accept()time.sleep(random.random())if not driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):# print("答题完成")breakexcept Exception as e:# print("未找到答题位置")time.sleep(random.random() * 3)
4.3判断视频是否看完,找到播放标签,如果播放标签的文本是‘重播’那么证明这个视频已经完成。跳出循环就好。
- 代码实现
try:# 找到重播按钮rename = driver.find_element_by_xpath('//*[@id="video"]/div[4]/button[1]').get_attribute('title')if rename == '重播':breakexcept Exception as e:time.sleep(random.random() * 3)
5返回上一层ifram的上一层ifram继续下一层 循环。
代码的不足之处:
-暂时不会判断视频是否播放过。
- 有一条输出语句中时间标签获取不出来。
- 播放时必须有一台电脑在运行程序,而且鼠标从页面出去,或者不进入到页面中,不然会造成暂停异常。(如果你有一台云主机的话,那就完美了)
运行结果:部分截图

如果有不会之处,或有代码异常,运行错误等,请联系下面公众号,你的反馈会使代码更加健壮。

简单的自动化使用--使用selenium实现学习通网站的刷慕课程序。注释空格加代码大概200行不到的更多相关文章
- (java)selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出
selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出: 该情况适合能能循环page=1~n,并且每个网页随着循环可以打开的情况, 注意一定是自己拼接的url可以 ...
- selenium webdriver学习(二)————对浏览器的简单操作(转载JARVI)
selenium webdriver学习(二)————对浏览器的简单操作 博客分类: Selenium-webdriver selenium webdriver对浏览器的简单操作 打开一个测试浏览 ...
- selenium自动化测试学习(一)
在学习selenium自动化测试前,我们需要先了解一点自动化测试的相关知识. (一)什么是自动化测试 (二)为什么要做自动化测试 (三)自动化测试优缺点 (1)什么是自动化测试 自动化测试是把以人为驱 ...
- Python+excel实现的简单接口自动化 V0.1
好久没写博客了..最近忙着工作以及新工作的事.. 看了下以前写的简单接口自动化,拿出来总结下,也算记录下学习成果 先来贴一下最后的结果,结果是写在原来的excel中 执行完毕后,会将结果写入到“状态” ...
- 自动化运维工具ansible学习+使用ansible批量推送公钥到远程主机
目录: 一.ansible简介 1.1.ansible是什么 1.2.ansible如何工作 1.3.ansible优缺点 1.4.ansible安装方式 1.5.ansible文件简单介绍 1.6. ...
- 自动化测试 python2.7 与 selenium 2 学习
windows环境搭建 # 下载 python[python 开发环境] http://python.org/getit/ # 下载 setuptools [python 的基础包工具]setupto ...
- selenium webdriver学习(六)------------如何得到弹出窗口
selenium webdriver学习(六)------------如何得到弹出窗口 在selenium 1.X里面得到弹出窗口是一件比较麻烦的事,特别是新开窗口没有id.name的时候.当时还整理 ...
- selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面(转)
selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面 博客分类: Selenium-webdriver 元素拖放drag and drop Q群里 ...
- selenium webdriver学习(八)------------如何操作select下拉框(转)
selenium webdriver学习(八)------------如何操作select下拉框 博客分类: Selenium-webdriver 下面我们来看一下selenium webdriv ...
随机推荐
- LuoguP3121 [USACO15FEB]审查(黄金)Censoring (Gold)【Hash做法】By cellur925
题目传送门 其实这题正解是AC自动机的,字符串哈希吸氧才能过的,但是我太菜了不会...只能先用哈希苟了. 在扫描单词的时候首先把各个单词的哈希值和长度存起来.然后按照长度从小到大将各单词排序.而那个长 ...
- 本周学习总结(ng-zorro/MDN索引/读书笔记)
按钮 <button ng-button nzType="primary">Primary</button> nzType="" pri ...
- Swift @objcMembers
使用@objcMembers关键字,将类中的所有方法暴露给Objc (效果等同于为所有方法加上@objc). 示例代码: @objcMembers class MyController: UIView ...
- 跟我一起玩Win32开发(15):ListView控件
这个控件其实不用阿拉来介绍,因为它太常见了,就好像我们一出门就会看到妹子一样常见.当然也可以说,它是对ListBox的扩充. 在使用该控件之前,我先介绍VS的一个相当好玩的功能. 在代码文件的#inc ...
- vue中methods中的方法闭包缓存问题
vue中methods中的方法闭包缓存问题 问题背景 需求描述 在路由的导航栏中需要, 判断是否为第一次点击 需要一个标志位来记录是否点击过 现状: 这个标志位只在一个函数中用过.不希望存放全局 希望 ...
- adb shell报错:error: insufficient permissions for device的解决办法
1.错误描述 执行 adb shell 时,报错如下; error: insufficient permissions for device 2.解决办法 1,终端执行 lsusb 结果如下,注意绿 ...
- 523 Continuous Subarray Sum 非负数组中找到和为K的倍数的连续子数组
非负数组中找到和为K的倍数的连续子数组 详见:https://leetcode.com/problems/continuous-subarray-sum/description/ Java实现: 方法 ...
- RAID 0、1、5、1+0总结
RAID(Redundant Array Of Independent Disk,独立磁盘冗余阵列),可以提供比普通磁盘更快的速度.更高的安全性,生产环境中服务器在安装时一般都会做RAID,RAID的 ...
- scrollTop、offsetTop、clientTop
1.offsetTop: obj.offsetTop 指 obj 相对于版面或由 offsetParent 属性指定的父坐标的计算上侧位置. 2.clientTop: 这个返回的是元素周围边框的厚度, ...
- 新手玩CSS中的一些黑科技
哎哎 1.鼠标移进网页里,不见了= = *{ cursor: none!important; } 2.简单的文字模糊效果 *{ color: transparent; text-shadow: #11 ...