用selenium对学习通进行自动化测试

一 前言

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再次进行封装

扫描二维码关注公众号,回复: 16701462 查看本文章

来端简单的关键字封装

    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仓库

封装的代码

猜你喜欢

转载自blog.csdn.net/qq_63401240/article/details/130128141