开通VIP,畅享免费电子书等14项超值服
首页
好书
留言交流
下载APP
联系客服
2022.07.03四川
(双枪)双手会给出答案
阅读前你可能需要:
所以只要分析网页的源代码,就可以实现自动化操作网页。
在模拟操作的过程中,必须提前知道即将发生什么,才能完美的自动化测试。
官网搜索就行
(安装完后在终端自查:输入python,如图则安装完成)
浏览器就不多说了,这里给出Driver的地址
chromedriver.storage.googleapis.com/index.html
(python安装目录script中放入对应版本的driver)
安装前其实要先安装pip,默认安装是有勾选的,而且这里网上有很多方法了,不多赘述。
安装好pip后可以在终端命令行中输入
pipinstallselenium
(安装selenium中)
(自查安装是否完成:pipshowselenium)
在系统中把python的目录添加进去就行,网络上也有很多,不多赘述。
选择你要那啥的平台,这里使用mooc作为演示
获取它的URL
但是由于自动化测试软件打开的浏览器没有cookie,不会识别用户
所以需要设计一下自动登陆的部分
在浏览器中按F12打开调试台再点击这个按钮
这个是元素选择器,选择那个绿色的“登陆/注册”
之后会跳出对应的
(确定元素位置有很多种方式,xpath是相对准确的一种,确定元素位置相当于告诉电脑你该在哪里进行操作)
(演示,gif中复制的是xpath,应该复制fullxpath)
/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[3]/div重复上述操作找到各个按钮的xpath,在代码中添加几个点击的动作
为了方便调试,大多数操作采用try-expcet语句
(但是前期敲代码的时候,建议先不要用try-except语句,因为编译器报错的信息更有用)
mooc网点击登陆后,会弹出新的小页面,由于weddriver每次只能识别一个页面,这里直接.switch_to_frame()
#登陆部分try:driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[3]/div').click()driver.find_element(By.XPATH,'/html/body/div[13]/div[2]/div/div/div/div/div[2]/span').click()print('点击登陆按钮成功\n')except:print('点击登陆按钮时出错')#输入账号密码部分try:driver._switch_to.frame(0)#这里转到fame0因为mooc网站点击登陆后是弹窗的driver.find_element(By.XPATH,'/html/body/div[2]/div[2]/div[2]/form/div/div[1]/div[2]/input').send_keys(account)driver.find_element(By.XPATH,'/html/body/div[2]/div[2]/div[2]/form/div/div[3]/div[2]/input[2]').send_keys(password)print('输入账号密码成功\n')driver.find_element(By.XPATH,'/html/body/div[2]/div[2]/div[2]/form/div/div[8]/a').click()except:print('登陆失败')上述代码中,总体来说,为了便于理解,是这样一个伪代码
driver.查找元素的方法('元素的位置').操作()find_element(By.XPATH,'xpath的内容')就是通过xpath来确定元素位置.click()就是点击的操作,.send_keys(参数)就是输入的操作这一步完成后应该是这样的效果(登陆次数非常多的时候,可能会有滑动验证)
如果上述操作都能够掌握,后面的其实就只是重复步骤而已,教程其实可以到这里就结束了。
如果还想继续看,请往下滑。
接下来是点击头像进入课程界面,选择课程。
注意:这时候webdriver聚焦在刚刚的frame上,先改回主页面,然后点击头像就可以进入“我的课程”界面
try:driver.switch_to.default_content()driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[1]/div/div/div[1]/div[3]/div[1]/img').click()print("点击头像成功\n")except:print("点击头像出错")接下来这里用“高等数学(一)”作为演示
继续获取元素的XPATH,重复操作即可
time.sleep(2)#点击高等数学(一)课程try:driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[3]/div/div[1]/div[3]/div/div[2]/div/div/div[2]/div[1]/div[2]/div/div[1]/div[1]/div[1]/a/div[1]/img').click()print("点击'高等数学(一)'成功")except:print("点击课程失败")time.sleep(4)#点击继续学习try:driver.switch_to.window(driver.window_handles[-1])driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div[1]/div/div[1]/div/a[1]').click()print('点击继续学习成功')except:print("点击继续学习失败")由于mooc网有自动播放功能,但是没有自动看课件的功能,这里演示观看每节课的课件
PS:其他网课网站(智慧树)有一些是没有自动播放的,非常反人类,这时候就可以运用上面的方法实现自动播放。
分析网页源代码发现,一套课程分为chapter和lesson俩个部分
(红蓝箭头一一对应)
在lesson的每一节中都有下面的几个
分析这一行格子的源代码可以发现
在当前的界面中,li标签中的class属性中多了个current
然后各个li标签的fullxpath是有一定规律的
(可以看见后缀是递增的)
上面说了,这里只演示全部看完课件,核心方法掌握了,就可以触类旁通了。
后来发现,classname似乎锁定不到这个元素,只能暴力破解了。(有好方法的请联系我)
一行最多不过10个格子
归纳出来是这样的
/html/body/div[4]/div[2]/...(省略)/ul/li[数字]所以可以通过只改变后面[数字]就行,每次都点击一下,先在全局变量中利用列表存储一下’[数字]’。
#全局变量区域lists=['1','2','3','4','5','6','7','8','9','10',]用for循环遍历列表(其实这里已经可以实现自动播放了,只要设置好第二个tiem.sleep()的参数就行)
foriinlists:time.sleep(2)driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/ul/li['+i+']').click()time.sleep(2)这里完成后是这样的。
(鼠标没有移动)
但是我需要多次点击,而且每次点击都是不同的页面,这时候就不得不分析chapter和lesson的源码
经过分析发现,俩者的源码也有一定规律
chapters/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[1]/div[1]/div/div[1]/div/div[2]/div[章节数]lessons/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[1]/div[1]/div/div[2]/div/div[2]/div[讲数]注意,这里俩个栏的元素是隐藏的。
可以通过js来先显示它
js="document.getElementsByClassName('downf-bgj-list')[0].style.display='block'"driver.execute_script(js)回到python编辑器,可以打上这样的代码(三个for嵌套)
#全局变量区域cha='/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[1]/div[1]/div/div[1]/div/div[2]/div'chapters=['1','2','3','4','5','6','7','8','9','10','11','12','13','14']les='/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[1]/div[1]/div/div[2]/div/div[2]/div'lessons=['1','2','3','4','5','6',]#疯狂点击#点击chapter后点击lesson然后点击视频和文档forcinchapters:time.sleep(1)js="document.getElementsByClassName('downf-bgj-list')[0].style.display='block'"driver.execute_script(js)driver.find_element(By.XPATH,cha+'['+c+']').click()time.sleep(1)forlinlessons:try:time.sleep(1)js2="document.getElementsByClassName('downf-bgj-list')[1].style.display='block'"driver.execute_script(js2)driver.find_element(By.XPATH,les+'['+l+']').click()time.sleep(1)except:breakforiinlists:try:time.sleep(1)driver.find_element(By.XPATH,'/html/body/div[4]/div[2]/div[4]/div[2]/div/div[1]/div/div/div[3]/ul/li['+i+']').click()time.sleep(1)except:break