简单的自动化使用--使用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下载下来的第十四行代码中,即

  1. # 点击河南
  2. henan = driver.find_element_by_xpath('要复制的地方')
  3. henan.click()

1.5.选择学校,点击左侧列表中的河南,在右侧找到你所在的学校,右击学校点击检查

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

1.7把复制的代码粘贴到从github下载下来的第22行

  1. # 点击洛阳理工
  2. louyang = driver.find_element_by_xpath('要复制的地方')
  3. louyang.click()

1.8接下来还要修改的代码部分是你要刷的那个慕课的网址,请确保是下面这个图中的url链接

1.9把整个url复制下来之后要替换的是从github下载下来的代码中的第45行代码,把url复制到下面要替换的位置

  1. # 得到慕课网址
  2. get_url = '要替换的地方网址'
  3. driver.get(get_url)
  4. time.sleep(5)

2.接下来就是运行程序,输入自己的账号密码和网页中的验证码。程序就可以跑起来了,就可以实现物理外挂来刷课。

如果只是想使用这个程序的话,上面的就已经够用了。下载github代码,修改省份,学校,和慕课网址运行程序就可以开启物理外挂来刷慕课了。如果想和我一起来维护这个程序的话,可以看下面的讲解,进一步了解这一程序的运行原理。

3.接下来就是重点,程序实现的原理。首先获取一共有多少个章节,遍历章节,处理网络不稳定,换公网,点击播放按钮,处理答题细节,处理打完题的情况。

3.0 播放器的html代码是在页面下面的ifram中的ifram中的hml代码里面要使用driver的switch_to.frame方法来切换到ifram中去。

  • 代码处理
  1. # 切换到下面的iframe里
  2. try:
  3. driver.switch_to.frame(driver.find_element_by_xpath('//body/div/div/p/div/iframe'))
  4. except:
  5. 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语句来处理先获取点击第一章节或第二章节的标签,出现异常再点击另一个按钮,这个方法可以完美的处理遍历章节中使每一个都可以遍历到

  • 下面是章节不一样的图

  • 下面是处理的代码

  1. # 点击章节
  2. try:
  3. driver.find_element_by_xpath('//*[@id="coursetree"]/div[' + str(i + 1) + ']').click()
  4. except:
  5. driver.find_element_by_xpath('//*[@id="coursetree"]/div[' + str(i + 1) + ']/div').click()

3.2点击播放按钮,播放按钮到目前位置发现有两种一种是直接在视频框里面的,另一种要先点击视频切换到视频框,在点击播放按钮。

  • 下面是第一种情况直接就可以点击播放按钮
  • 下面是第二种情况,要先点视频,再点击播放按钮
  • 下面是处理这两种情况的处理逻辑
  1. # 找到播放按钮并点击
  2. try:
  3. button = driver.find_element_by_xpath('//*[@id="reader"]')
  4. button.click()
  5. except:
  6. driver.find_element_by_xpath('//*[@id="dct2"]').click()
  7. driver.find_element_by_xpath('//*[@id="reader"]').click()

3.3处理网络问题,有时候使用本校的网是不行的,会出现网络不佳的问题,所有要使用代码来直接切换到公网按钮,使用代码先点击本校按钮,再点击公网2按钮(直接点击公网2按钮是不行的,实验过了,这些点击的按钮的位置都是通过findelementby_xpath来获取的,和上面方法一样不在多说。)

  • 下面是实现代码
  1. # 找到公网
  2. try:
  3. driver.find_element_by_xpath('//*[@id="video"]/div[4]/div[8]/span').click()
  4. driver.find_element_by_xpath('//*[@id="video"]/div[4]/div[8]/div/ul/li[3]/span[1]').click()
  5. except:
  6. pass

3.4像找到快进按钮啊,静音按钮都是一个办法的。通过findelementby_xpath方法得到并点击。

4.下面处理答题,完成视频,和网络不佳的情况。这些逻辑但是在try-except里面处理的

4.1出现网络不佳时,使用右击--->检查---->右击copy---->copy xpath来获取公网2的标签位置并点击。

  1. # 当网络不可用时 点击公网
  2. try:
  3. driver.find_element_by_xpath('//*[@id="vjserrdisplay-1035"]/ul/li[2]/label').click()
  4. except:
  5. pass

4.2出现答题时找到,视频中答题位置,找到选择题选项位置,遍历每一个选项点击,总有一个是正确的(而且这个答案是不影响总成绩的) -代码实现

  1. # 找到视频中出现的答题位置
  2. if driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
  3. # 找到选择题
  4. button3 = driver.find_elements_by_xpath('//body/div[4]/div/div[7]/span/div/div/ul/li')
  5. # print("button3{}", button3)
  6. while driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
  7. # print(1)
  8. # 对选项进行遍历
  9. for button1 in button3:
  10. button1 = button1.find_element_by_xpath('label')
  11. # print("button1{}", button1)
  12. button1.click()
  13. time.sleep(random.random() * 3)
  14. # 点击提交按钮
  15. button5 = driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div/div[2]')
  16. # print("button5{}", button5)
  17. button5.click()
  18. time.sleep(random.random() * 3)
  19. if driver.switch_to.alert():
  20. al = driver.switch_to.alert()
  21. al.accept()
  22. time.sleep(random.random())
  23. if not driver.find_element_by_xpath('//body/div[4]/div/div[7]/span/div/div'):
  24. # print("答题完成")
  25. break
  26. except Exception as e:
  27. # print("未找到答题位置")
  28. time.sleep(random.random() * 3)

4.3判断视频是否看完,找到播放标签,如果播放标签的文本是‘重播’那么证明这个视频已经完成。跳出循环就好。

  • 代码实现
  1. try:
  2. # 找到重播按钮
  3. rename = driver.find_element_by_xpath('//*[@id="video"]/div[4]/button[1]').get_attribute('title')
  4. if rename == '重播':
  5. break
  6. except Exception as e:
  7. time.sleep(random.random() * 3)

5返回上一层ifram的上一层ifram继续下一层 循环。

代码的不足之处:

-暂时不会判断视频是否播放过。

  • 有一条输出语句中时间标签获取不出来。
  • 播放时必须有一台电脑在运行程序,而且鼠标从页面出去,或者不进入到页面中,不然会造成暂停异常。(如果你有一台云主机的话,那就完美了)

运行结果:部分截图

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

简单的自动化使用--使用selenium实现学习通网站的刷慕课程序。注释空格加代码大概200行不到的更多相关文章

  1. (java)selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出

    selenium webdriver学习---实现简单的翻页,将页面内容的标题和标题链接取出: 该情况适合能能循环page=1~n,并且每个网页随着循环可以打开的情况, 注意一定是自己拼接的url可以 ...

  2. selenium webdriver学习(二)————对浏览器的简单操作(转载JARVI)

    selenium webdriver学习(二)————对浏览器的简单操作 博客分类: Selenium-webdriver   selenium webdriver对浏览器的简单操作 打开一个测试浏览 ...

  3. selenium自动化测试学习(一)

    在学习selenium自动化测试前,我们需要先了解一点自动化测试的相关知识. (一)什么是自动化测试 (二)为什么要做自动化测试 (三)自动化测试优缺点 (1)什么是自动化测试 自动化测试是把以人为驱 ...

  4. Python+excel实现的简单接口自动化 V0.1

    好久没写博客了..最近忙着工作以及新工作的事.. 看了下以前写的简单接口自动化,拿出来总结下,也算记录下学习成果 先来贴一下最后的结果,结果是写在原来的excel中 执行完毕后,会将结果写入到“状态” ...

  5. 自动化运维工具ansible学习+使用ansible批量推送公钥到远程主机

    目录: 一.ansible简介 1.1.ansible是什么 1.2.ansible如何工作 1.3.ansible优缺点 1.4.ansible安装方式 1.5.ansible文件简单介绍 1.6. ...

  6. 自动化测试 python2.7 与 selenium 2 学习

    windows环境搭建 # 下载 python[python 开发环境] http://python.org/getit/ # 下载 setuptools [python 的基础包工具]setupto ...

  7. selenium webdriver学习(六)------------如何得到弹出窗口

    selenium webdriver学习(六)------------如何得到弹出窗口 在selenium 1.X里面得到弹出窗口是一件比较麻烦的事,特别是新开窗口没有id.name的时候.当时还整理 ...

  8. selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面(转)

    selenium webdriver学习(十)------------如何把一个元素拖放到另一个元素里面 博客分类: Selenium-webdriver 元素拖放drag and drop  Q群里 ...

  9. selenium webdriver学习(八)------------如何操作select下拉框(转)

    selenium webdriver学习(八)------------如何操作select下拉框 博客分类: Selenium-webdriver   下面我们来看一下selenium webdriv ...

随机推荐

  1. 2-zakoo使用

    source:http://kazoo.readthedocs.io/en/latest/basic_usage.html 1 基本使用 1.1 连接处理 要使用zakoo,需要创建一个KazooCl ...

  2. [洛谷P3512 [POI2010]PIL-Pilots]

    题目链接: 传送门走这里 题目分析: 感觉不是很难啊--不像是蓝题(AC量也不像)恶意评分? 少打了一个+1调了半天,就这样居然还能过60pts?我思路和题解第一篇高度重合是什么鬼啊,太过分了吧本来还 ...

  3. Codeforces Round #405 (rated, Div. 2, based on VK Cup 2017 Round 1) D

    Description A tree is an undirected connected graph without cycles. The distance between two vertice ...

  4. XHTML 1.0 的三种 XML 文档类型 DOCTYPE

    XHTML 1.0 的三种 XML 文档类型 XHTML 1.0 规定了三种 XML 文档类型 XHTML 1.0 Strict <!DOCTYPE html PUBLIC "-//W ...

  5. 通用mapper的generator

    <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-genera ...

  6. 解决Android Studio安装过程中“SDK tools directory is missing”的问题

    "SDK tools directory is missing",这是因为安装时你的计算机无法连接到google的服务器(对google服务器的域名地址解析出问题了),无法从goo ...

  7. 3. UITest笔记

    1.    XCUIApplication *app = [[XCUIApplication alloc] init]; App为查询的入口,当界面发生变化,查询数也会随之更新. 即使是先前存储的XC ...

  8. fsck和badlocks

    fsck可以检查好几种不同的文件系统,fsck只是一个中和程序而已,个别的文件系统检查程序都在/sbin中,可以使用ls -l /sbin/fsck* -A 按照/etc/fstab的内容,将所有的设 ...

  9. Javaweb学习笔记7—JDBC技术

      今天来讲javaweb的第7阶段学习. JDBC技术,关于JDBC本篇博客只介绍了它的一部分,后面博客会更加深入探讨. 老规矩,首先先用一张思维导图来展现今天的博客内容.   ps:我的思维是用的 ...

  10. 纯css滚动公告栏目

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...