一 前言
1 安装selenium与webdriver
selenium是python的第三方库,pip一下就可以。
对于webdriver,我用的是Edge,去官网下一下
Microsoft Edge WebDriver - Microsoft Edge Developer
如果用的是其他的浏览器,比如Chrome等,同样的操作
下载完之后,
网上有的教程需要配准环境变量等的操作。感觉没必要
把webdriver 解压,得到msedgedriver.exe
把这个放到python 解释器的下面,我的是这样的。
C:\Users\520\AppData\Local\Programs\Python\Python310。
放到python310文件夹里面。
2 po设计模式
po设计模式,说白了,就是对selenium再次进行封装
来端简单的关键字封装
def locates(self, name, value):
return self.driver.find_elements(name, value)
def xpaths(self, value):
return self.locates(By.XPATH, value)
"""
这段代码本质上就是对find_elements的封装
再结合对xpath进行的封装。
"""
在正文中有许多自己的封装,哈哈哈哈哈,
最后给出用过的。
二 正文
1 登录
是需要输入手机号,密码。
class Xuexitong:
def __init__(self,n=1):
self.driver=web()
self.n=n
# n 后面再说什么意思
# 初始化,得到webdriver对象
def login(self):
# open 就是对get方法的封装
self.driver.open('https://passport2.chaoxing.com/login?fid=&newversion=true&refer=http%3A%2F%2Fi.chaoxing.com')
self.driver.i_put('phone','xxxxx')
# i_put 对id,find_element,send_keys的封装
self.driver.i_put('pwd','xxxxx')
self.driver.i_click('loginBtn')
# i_click是id和click的封装
上面过程为:
打开官网->输入手机号>输入密码->点击确定按钮
2 选择课程
def click_course(self):
self.driver.wait(1)
# 等待1s time.sleep的封装
self.driver.switch_frame('frame_content')
# 进入框架,很重要,不然会找不到元素。
# self.n 就是课程的序号,从1到最后,选择自己需要点击的课程
self.driver.x_click(f'//*[@class="course-list"]/li[{self.n}]/div/a')
3 确定要点击的课程数)
有的课程数是显示的是1,有的是2,很明显排除掉1,点击2。
def choose_window(self):
# 需要先切换窗口,选择句柄,不妨称为列表窗口
# 不然还是再原来的窗口
self.driver.switch_handle(-1)
self.driver.wait(1)
# 进入列表窗口的框架
self.driver.switch_frame('frame_content-zj')
def get_course_nums(self):
course_nums=[]
self.choose_window()
course=self.driver.xpaths('//*[@class="chapter_unit"][3]/div[2][1]/ul/li/div/div/div[3]/div/span[1]')
# couser 就是用了xpaths, 得到课程数,返回的是元素
for t in course:
value=self.driver.get_text(t)
# 得到内容
course_nums.append(value)
# 比如是这样的[1,1,1,1,1,1,1,1,2,2,2,2,2,2,2]等的
# 也有可能有3。
return course_nums
4 点击需要进入的章节
def main(self):
self.login()
self.click_course()
nums=self.get_course_nums()
# 前面的操作。得到课程数
for i,t in enumerate(nums):
# 循环
if t=='2':
# 对章节数的进行后续操作,play操作
self.play(i+1)
5 play操作
def play(self,num):
self.choose_window()
# 选择窗口
self.start_play(num)
# start_play操作
6 start_play操作
def start_play(self,num):
self.driver.x_click(f'//*[@class="chapter_unit"][3]/div/ul/li[{num}]/div/div/div[3]')
# 点击跳转
self.driver.switch_handle(-1)
# 选择窗口
self.driver.switch_frame('iframe')
# 进入框架
self.driver.switch_frame('//*[@id="ext-gen1049"]/iframe')
# 进入框架
self.driver.wait(2)
self.driver.x_click('//*[@class="vjs-big-play-button"]')
# 点击播放按钮
while 1:
# 等待播放完成
flag = self.get_new_num()
if flag:
break
return False
def get_new_num(self):
self.driver.wait(10)
div = self.driver.xpath(f'//*[@id="reader"]/div')
get_class = self.driver.get_attr(div, 'class')
tag_class = 'video-js vjs-default-skin vjs-big-play-centered vjs-controls-enabled vjs-workinghover vjs-v7 vjs-has-started video-dimensions vjs-user-inactive vjs-paused vjs-ended'
tag_class1='video-js vjs-default-skin vjs-big-play-centered vjs-controls-enabled vjs-workinghover vjs-v7 vjs-has-started video-dimensions vjs-paused vjs-ended vjs-user-inactive'
# 播放完成或有某些标签的变化。仔细寻找
if get_class == tag_class or get_class==tag_class1:
self.driver.switch_default()
self.driver.x_click('//*[@id="contentFocus"]/i')
# 退出按钮
self.driver.wait(4)
return True
7 选择窗口
def choose_window(self):
self.driver.switch_handle(-1)
self.driver.wait(1)
self.driver.switch_frame('frame_content-zj')
上述操作---选择要测试的视频->点击播放->等待播放完成->退出
具体实际可看自己操作,随机应变。
三 源码
from init import web
# 封装导包
class Xuexitong:
def __init__(self,n=1):
self.driver=web()
self.n=n
self.main()
def login(self):
self.driver.open('https://passport2.chaoxing.com/login?fid=&newversion=true&refer=http%3A%2F%2Fi.chaoxing.com')
self.driver.i_put('phone','xx')
self.driver.i_put('pwd','xx')
self.driver.i_click('loginBtn')
def click_course(self):
self.driver.wait(1)
self.driver.switch_frame('frame_content')
self.driver.x_click(f'//*[@class="course-list"]/li[{self.n}]/div/a')
def get_course_nums(self):
course_nums=[]
self.choose_window()
course=self.driver.xpaths('//*[@class="chapter_unit"][3]/div[2][1]/ul/li/div/div/div[3]/div/span[1]')
for t in course:
value=self.driver.get_text(t)
course_nums.append(value)
return course_nums
def main(self):
self.login()
self.click_course()
nums=self.get_course_nums()
for i,t in enumerate(nums):
if t=='2':
self.play(i+1)
def play(self,num):
self.choose_window()
self.start_play(num)
def get_new_num(self):
self.driver.wait(10)
div = self.driver.xpath(f'//*[@id="reader"]/div')
get_class = self.driver.get_attr(div, 'class')
tag_class = 'video-js vjs-default-skin vjs-big-play-centered vjs-controls-enabled vjs-workinghover vjs-v7 vjs-has-started video-dimensions vjs-user-inactive vjs-paused vjs-ended'
tag_class1='video-js vjs-default-skin vjs-big-play-centered vjs-controls-enabled vjs-workinghover vjs-v7 vjs-has-started video-dimensions vjs-paused vjs-ended vjs-user-inactive'
if get_class == tag_class or get_class==tag_class1:
self.driver.switch_default()
self.driver.x_click('//*[@id="contentFocus"]/i')
self.driver.wait(4)
return True
def start_play(self,num):
self.driver.x_click(f'//*[@class="chapter_unit"][3]/div/ul/li[{num}]/div/div/div[3]')
self.driver.switch_handle(-1)
self.driver.switch_frame('iframe')
self.driver.switch_frame('//*[@id="ext-gen1049"]/iframe')
self.driver.wait(2)
self.driver.x_click('//*[@class="vjs-big-play-button"]')
while 1:
flag = self.get_new_num()
if flag:
break
return False
def choose_window(self):
self.driver.switch_handle(-1)
self.driver.wait(1)
self.driver.switch_frame('frame_content-zj')
def main():
Xuexitong()
四 封装的代码
看我的github仓库