智能化软件测试

测试任务:
在https://www.bilibili.com/网站中
要求:以下测试,需以POM模式编写

任务1:在2022年的番剧中,按照“追番人数”升序排序,获取两页的番剧的追番人数,并测试两页番剧的追番人数是否是升序排序;
任务2:在2022年的番剧中,按照“追番人数”升序排序,获取两页的番剧的番名+集数,并测试2022番剧页面 与 每一个番剧的页面中的番名+集数,是否一致;
任务3:在“鬼灭之刃 游郭篇”的番剧页面中,测试该番的集数 与 右侧的选集是否一致;

任务4:在2023年的番剧中,按照“最高评分”进行排序,获取两页番剧的评分,测试评分排序是否正确;

任务5:在“番剧首页”的页面上方,有个会随着时间不断变动的推荐番剧区域,这里需要通过selenium控制鼠标移动到这些推荐番剧上,测试番剧的名称是否一致,如下图框住所示;

 

目录

一、搭建框架+创建页面对象脚本

二、创建页面对象的基类(base_page.py)

三、各页面对象脚本代码

任务1: 

①编写blibli_index_object01.py

②编写blibli_get_fanju_name_number01.py

③编写test01_case_Number_of_followers.py(任务1:运行此py文件)

任务1运行结果图:

任务2:

①编写blibli_index_object02.py

②编写blibli_get_fanju_name_number02.py

③编写blibli_xinfan_object02.py

④编写test02_case_Get_name_number.py(任务2:运行此py文件)

任务2运行结果图:

任务3:

①编写blibli_index_object03.py

②编写blibli_get_fanju_name_number03.py

③编写blibli_xinfan_object03.py

④编写test03_case_jishu_right_jishu.py(任务3:运行此py文件)

任务3运行结果图:

任务4:

①编写blibli_index_object04.py

②编写blibli_get_fanju_name_number04.py

③编写test04_case_score.py(任务4:运行此py文件)

任务4运行结果图:

任务5:

①编写blibli_index_object05.py

②编写blibli_get_fanju_name_number05.py

③编写test05_case.py(任务5:运行此py文件)

任务5运行结果图:


 开始编写:

一、搭建框架+创建页面对象脚本

各任务所对应的py文件如下:

基类:
base_page.py

任务1:在2022年的番剧中,按照“追番人数”升序排序,获取两页的番剧的追番人数,并测试两页番剧的追番人数是否是升序排序;
blibli_index_object01.py
blibli_get_fanju_name_number01.py
test01_case_Number_of_followers.py


任务2:在2022年的番剧中,按照“追番人数”升序排序,获取两页的番剧的番名+集数,并测试2022番剧页面 与 每一个番剧的页面中的番名+集数,是否一致;
blibli_index_object02.py
blibli_get_fanju_name_number02.py
blibli_xinfan_object02.py
test02_case_Get_name_number.py


任务3:在“鬼灭之刃 游郭篇”的番剧页面中,测试该番的集数 与 右侧的选集是否一致;
blibli_index_object03.py
blibli_get_fanju_name_number03.py
blibli_xinfan_object03.py
test03_case_jishu_right_jishu.py
任务4:在2023年的番剧中,按照“最高评分”进行排序,获取两页番剧的评分,测试评分排序是否正确;
blibli_index_object04.py
blibli_get_fanju_name_number04.py
test04_case_score.py


任务5:在“番剧首页”的页面上方,有个会随着时间不断变动的推荐番剧区域,这里需要通过selenium控制鼠标移动到这些推荐番剧上,测试番剧的名称是否一致,如下图框住所示;
blibli_index_object05.py
blibli_get_fanju_name_number05.py
test05_case.py

二、创建页面对象的基类(base_page.py)

代码如下:

# 网页基类
class Base:
    # 创建临时的driver对象
    # driver = webdriver.Chrome()

    # 外界创建网页对象的时候,需要将浏览器传进来
    def __init__(self, driver):
        self.driver = driver

    # 打开网址
    def open(self, url):
        self.driver.get(url)

    # 元素查找,loc参数(by, value)
    def locator(self, loc):
        return self.driver.find_element(*loc)

    # 在指定父元素查找子元素
    def locatorByParent(self, parent, loc):
        return parent.find_element(*loc)

    # 查找多个元素
    def locators(self, loc):
        return self.driver.find_elements(*loc)

    # 在指定父元素查找多个子元素
    def locatorsByParent(self, parent, loc):
        return parent.find_elements(*loc)

    # 切换到当前页面
    def switch(self):
        # 将浏览器切换到当前页面
        window = self.driver.window_handles
        self.driver.switch_to.window(window[-1])

    # 输入
    def input(self, loc, content):
        self.locator(loc).send_keys(content)

    # 点击
    def click(self, loc):
        self.locator(loc).click()

    # 写入数据
    def write(self, filePath, content, mode='w'):
        f = open(filePath, mode)
        f.write(content)
        f.close()


三、各页面对象脚本代码

任务1:

①编写blibli_index_object01.py

代码如下:

# 核心业务流程
        # 打开b站首页
        # 点击番剧按钮,打开番剧页面
        #点击2022年的番剧页面
        # 点击“追番人数”升序排序按钮
        # #把打开的番剧页面返回出去
from base_page.base_page import Base  # 导入基类---(理解:导入功能模块)
import time
from page_object.blibli_get_fanju_name_number01 import BliBliFanju

# b站首页
class BlibliIndex(Base):
    # url
    url = "http://www.bilibili.com"
    # 核心元素
    el_button = ('xpath', '//*[@id="i_cecream"]/div[2]/div[1]/div[3]/div[2]/div/div[1]/a[1]')
    el_button_2022 = ('xpath', '// *[ @ id = "home_v3_mod_index"] / div / div[3] / div / div / div[2] / a[1]')
    el_button_up = ('xpath', '// *[ @ id = "app"] / div[2] / div[1] / ul[1] / li[1] / span')


    # 核心业务
    def openBlibliFanju(self):
        # 打开b站首页
        self.open(self.url)
        # 等待一段时间
        time.sleep(1)
        # 点击番剧按钮,打开番剧页面
        self.locator(self.el_button).click()
        time.sleep(3)
        #切换到当前窗口
        self.switch()
        time.sleep(1)
        #点击2022年的番剧页面
        self.locator(self.el_button_2022).click()
        time.sleep(3)
        # 切换到当前窗口
        self.switch()
        # 点击“追番人数”升序排序按钮
        self.locator(self.el_button_up).click()
        time.sleep(2)
        # #把打开的番剧页面返回出去
        return BliBliFanju(self.driver)
②编写blibli_get_fanju_name_number01.py

代码如下:

import time
import re
from base_page.base_page import Base


# b站番剧首页
class BliBliFanju(Base):
    # 核心元素
    # 每个番剧的追番人数元素xpath
    el_xinFanNumber = ("xpath", '//*[@class="shadow"]')
    # 第二页番剧的按钮元素xpath
    el_xinFan_NextButton = ("xpath", '//*[@class="pagelistbox clearfix"]/a[2]')

    # 存放两页番剧的追番人数
    xinFanNumber = []

    # 此函数为正则匹配追番人数的数量
    def get_zhuifan_num(self, name_list):
        result = []
        pattern = re.compile(r'(\d+(\.\d+)?)(万)?[追番 | 追剧 ]')
        for item in name_list:
            match = pattern.search(item)
            if match:
                num_str = match.group(1)
                if match.group(3):
                    num = float(num_str) * 10000
                else:
                    num = int(num_str)
                result.append(num)
            else:
                result.append(None)
        return result

    # 核心业务

    # 获取b站2022追番页面的1、2页追番人数
    def GetXinFanInfor01(self):
        # 切换当前页面
        self.switch()
        # 获取第一页番剧的追番人数
        temp = self.locators(self.el_xinFanNumber)
        for i in range(len(temp)):
            self.xinFanNumber.append(temp[i].text)
        # 找到番剧的第二页按钮,点击切换到第二页
        self.locator(self.el_xinFan_NextButton).click()
        # 等待一段时间,让页面切换到下一页
        time.sleep(2)
        # 获取第二页番剧的追番人数
        temp = self.locators(self.el_xinFanNumber)
        for i in range(len(temp)):
            self.xinFanNumber.append(temp[i].text)
        #打印所获取到的追番人数
        print(self.xinFanNumber)

        # 判断追番人数”是否按照升序排序
        result = self.get_zhuifan_num(self.xinFanNumber)
        oringin = result
        result.sort(reverse=False)
        # 原始获取到的追番人数列表
        print('提取追番人数的列表:',oringin)
        # sort(reverse=False)函数升序后的追番人数列表
        print('追番人数列表升序后的列表:',result)
        print("对比上面两个列表,判断追番人数是否按照升序排序:", result == oringin)
③编写test01_case_Number_of_followers.py(任务1:运行此py文件)

代码如下:

import time
import unittest
from selenium import webdriver
from page_object.blibli_index_object01 import BlibliIndex

class TestCase_GetxinFanInfor(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        # 创建浏览器
        cls.driver = webdriver.Chrome()
        # 创建b站首页
        cls.blibli = BlibliIndex(cls.driver)
        # 打开b站番剧首页
        cls.blibliFanJu = cls.blibli.openBlibliFanju()
    @classmethod
    def tearDownClass(cls):
        # 退出浏览器
        cls.driver.quit()

    # 测试用例函数
    def test_OpenBliBliFanJu(self):
        # 执行b站番剧首页中 获取新番信息的业务
        self.blibliFanJu.GetXinFanInfor01()
        # 停留一段时间
        time.sleep(0.5)


if __name__ == '__main__':
    unittest.main()
任务1运行结果图:

任务2:

①编写blibli_index_object02.py

代码如下:

# 核心业务流程
        # 打开b站首页
        # 点击番剧按钮,打开番剧页面
        #点击2022年的番剧页面
        # 点击“追番人数”升序排序按钮
        # #把打开的番剧页面返回出去
from base_page.base_page import Base  # 导入基类---(理解:导入功能模块)
import time
from page_object.blibli_get_fanju_name_number02 import BliBliFanju02

# b站首页
class BlibliIndex(Base):
    # url
    url = "http://www.bilibili.com"
    # 核心元素
    el_button = ('xpath', '//*[@id="i_cecream"]/div[2]/div[1]/div[3]/div[2]/div/div[1]/a[1]')
    el_button_2022 = ('xpath', '// *[ @ id = "home_v3_mod_index"] / div / div[3] / div / div / div[2] / a[1]')
    el_button_up = ('xpath', '// *[ @ id = "app"] / div[2] / div[1] / ul[1] / li[1] / span')


    # 核心业务
    def openBlibliFanju(self):
        # 打开b站首页
        self.open(self.url)
        # 等待一段时间
        time.sleep(1)
        # 点击番剧按钮,打开番剧页面
        self.locator(self.el_button).click()
        time.sleep(3)
        #切换到当前窗口
        self.switch()
        time.sleep(1)
        #点击2022年的番剧页面
        self.locator(self.el_button_2022).click()
        time.sleep(3)
        # 切换到当前窗口
        self.switch()
        # 点击“追番人数”升序排序按钮
        self.locator(self.el_button_up).click()
        time.sleep(2)
        # #把打开的番剧页面返回出去
        return BliBliFanju02(self.driver)
②编写blibli_get_fanju_name_number02.py

代码如下:

import time
from page_object.blibli_xinfan_object02 import BliBliXinFan02
from base_page.base_page import Base

# b站番剧首页
class BliBliFanju02(Base):
    # 核心元素
    # 每个番剧的番剧名
    el_xinFanName = ("xpath", '//*[@class="bangumi-title"]')
    # 每个番剧的集数
    el_xinFan_ji_Number = ("xpath", '//*[@class="pub-info"]')
    # 每个番剧的链接
    el_xinFanUrl = ("xpath", '//*[@class="cover-wrapper"]')
    # 新番区域下一页的按钮
    el_xinFan_NextButton = ("xpath", '//*[@class="pagelistbox clearfix"]/a[2]')
    # 存放两页番剧的追番人数
    xinFanNumber = []
    # 存放两页番剧的番名
    xinFanName = []
    # 存放两页番剧对应的集数
    xinFan_ji_Number = []
    # 存放两页番剧的链接
    xinFanUrls = []
    # # 存放所有新番的页面对象
    xinFanPages = []

    # 核心业务
    # 获取两页的番剧的番名+集数,并测试2022番剧页面 与 每一个番剧的页面中的番名+集数,是否一致
    def GetXinFanInfor(self):
        # 切换当前页面
        self.switch()
        try:
            # 获取第一页番剧的番剧名
            temp = self.locators(self.el_xinFanName)
            for i in range(len(temp)):
                self.xinFanName.append(temp[i].text)
            # 获取第一页番剧对应的集数
            temp = self.locators(self.el_xinFan_ji_Number)
            for i in range(len(temp)):
                self.xinFan_ji_Number.append(temp[i].text)
            # 获取第一页的番剧链接
            temp = self.locators(self.el_xinFanUrl)
            for i in range(len(temp)):
                self.xinFanUrls.append(temp[i].get_attribute('href'))

            # 找到新番区域中的第二页按钮,点击切换到第二页
            self.locator(self.el_xinFan_NextButton).click()
            # 等待一段时间,让新番切换到下一页
            time.sleep(2)

            # 获取第二页的番剧名
            temp = self.locators(self.el_xinFanName)
            for i in range(len(temp)):
                self.xinFanName.append(temp[i].text)
            # 获取第二页番剧对应的集数
            temp = self.locators(self.el_xinFan_ji_Number)
            for i in range(len(temp)):
                self.xinFan_ji_Number.append(temp[i].text)
            # 获取第二页番剧的链接
            temp = self.locators(self.el_xinFanUrl)
            for i in range(len(temp)):
                self.xinFanUrls.append(temp[i].get_attribute('href'))
        except:
            print("null")
        #打印获取的番剧名
        print(self.xinFanName)
        # 打印获取的番剧集数
        print(self.xinFan_ji_Number)
        # 打印获取的番剧对应的url
        # print(self.xinFanUrls)

        # 根据新番数,创建相应数量的新番页面对象
        for url in self.xinFanUrls:
            # 创建新番页面对象
            xinFan = BliBliXinFan02(self.driver)
            # 给新番页面对象赋予网址url
            xinFan.url = url
            # 把新番页面对象存放到容器中
            self.xinFanPages.append(xinFan)
            # print(self.xinFanPages)
    # 打开指定新番
    def OpenXinFan(self, index):
        # 获取指定的新番
        xinFan = self.xinFanPages[index]
        # print(xinFan)
        # 打开新番的网页
        self.open(xinFan.url)
        # 将新番的页面对象返回出去
        return xinFan
③编写blibli_xinfan_object02.py

代码如下:

from base_page.base_page import Base


# b站新番
class BliBliXinFan02(Base):
    # url
    url = None
    # 核心元素
    # 新番的番名元素xpath
    el_xinFanName = ("xpath", '//*[@class="mediainfo_mediaTitle__lu7u_"]')
    # 新番的追番人数元素xpath
    el_xinFan_ji_Number = ("xpath", '//*[@class="mediainfo_mediaDesc__0JJwL"][2]/span[3]')
    # 新番的番名
    xinFanName = None
    # 新番的追番人数
    xinFan_ji_Number = None

    # 核心业务
    # 获取新番页的信息
    def GetInfor(self):
        # 切换到最新的页面
        self.switch()
        # 获取新番页面的番名+追番人数
        self.xinFanName = self.locator(self.el_xinFanName).text
        self.xinFan_ji_Number = self.locator(self.el_xinFan_ji_Number).text
④编写test02_case_Get_name_number.py(任务2:运行此py文件)

代码如下:

import time
import unittest
from selenium import webdriver
from page_object.blibli_index_object02 import BlibliIndex

class TestCase_GetxinFanInfor(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # 创建浏览器
        cls.driver = webdriver.Chrome()
        # 创建b站首页
        cls.blibli = BlibliIndex(cls.driver)
        # 打开b站番剧首页
        cls.blibliFanJu = cls.blibli.openBlibliFanju()
        # 获取b站番剧首页的番剧信息
        cls.blibliFanJu.GetXinFanInfor()
    @classmethod
    def tearDownClass(cls):
        # 退出浏览器
        cls.driver.quit()

    # 测试用例函数
    def test_OpenBliBliFanJu(self):
        a = [] #存放b站番剧首页的番剧名
        b = [] #存放每一个番剧的页面中的番名
        c = [] #存放b站番剧首页的番剧集数
        d = [] #存放每一个番剧的页面中的集数
        # 循环打开所有的新番
        for i in range(len(self.blibliFanJu.xinFanPages)):
            # 打开指定的新番
            xinFan = self.blibliFanJu.OpenXinFan(i)
            # 获取当前新番的信息
            xinFan.GetInfor()
            # 停留一段时间
            time.sleep(1)

            # 去掉额外的文本和符号
            expected = xinFan.xinFan_ji_Number.replace("已完结, ", "").replace("·", "").strip()

            # 输出b站番剧首页的新番番名+集数,以及新番页面中的番名+集数
            print()
            print('b站番剧首页:', self.blibliFanJu.xinFanName[i], self.blibliFanJu.xinFan_ji_Number[i])
            print('新番页面  :', xinFan.xinFanName, expected)

            # 断言测试2022番剧页面 与 每一个番剧的页面中的番名,是否一致
            self.assertEqual(self.blibliFanJu.xinFanName[i],xinFan.xinFanName)

            if '话' in expected:
                # 断言测试2022番剧页面 与 每一个番剧的页面中的集数,是否一致
                self.assertEqual(self.blibliFanJu.xinFan_ji_Number[i],expected)
            a.append(self.blibliFanJu.xinFanName[i])
            b.append(xinFan.xinFanName)
            c.append(self.blibliFanJu.xinFan_ji_Number[i])
            d.append(expected)
        print(a)
        print(b)
        print(c)
        print(d)
if __name__ == '__main__':
    unittest.main()
任务2运行结果图:

任务3:

①编写blibli_index_object03.py

代码如下:

# 核心业务流程
        # 打开b站首页
        # 点击番剧按钮,打开番剧页面
        #点击2022年的番剧页面
        # #把打开的番剧页面返回出去
from base_page.base_page import Base  # 导入基类---(理解:导入功能模块)
import time
from page_object.blibli_get_fanju_name_number03 import BliBliFanju03

# b站首页
class BlibliIndex(Base):
    # url
    url = "http://www.bilibili.com"
    # 核心元素
    el_button = ('xpath', '//*[@id="i_cecream"]/div[2]/div[1]/div[3]/div[2]/div/div[1]/a[1]')
    el_button_2022 = ('xpath', '// *[ @ id = "home_v3_mod_index"] / div / div[3] / div / div / div[2] / a[1]')

    # 核心业务
    def openBlibliFanju(self):
        # 打开b站首页
        self.open(self.url)
        # 等待一段时间
        time.sleep(1)
        # 点击番剧按钮,打开番剧页面
        self.locator(self.el_button).click()
        time.sleep(3)
        #切换到当前窗口
        self.switch()
        time.sleep(1)
        #点击2022年的番剧页面
        self.locator(self.el_button_2022).click()
        time.sleep(2)
        # 切换到当前窗口
        self.switch()
        time.sleep(1)
        # #把打开的番剧页面返回出去
        return BliBliFanju03(self.driver)
②编写blibli_get_fanju_name_number03.py

代码如下:

from page_object.blibli_xinfan_object03 import BliBliXinFan03
from base_page.base_page import Base

# b站番剧首页
class BliBliFanju03(Base):
    # 核心元素
    # 每个番剧的链接
    el_xinFanUrl = ("xpath", '//*[@class="cover-wrapper"]')

    # 存放当前页面番剧的链接
    xinFanUrls = []
    # # 存放所有新番的页面对象
    xinFanPages = []

    # 核心业务
    # 测试该番的集数 与 右侧的选集是否一致
    def GetXinFanInfor(self):
        # 切换当前页面
        self.switch()
        # 获取当前页的新番链接
        temp = self.locators(self.el_xinFanUrl)
        for i in range(len(temp)):
            self.xinFanUrls.append(temp[i].get_attribute('href'))
        # 根据新番数,创建相应数量的新番页面对象
        for url in self.xinFanUrls:
            # 创建新番页面对象
            xinFan = BliBliXinFan03(self.driver)
            # 给新番页面对象赋予网址url
            xinFan.url = url
            # 把新番页面对象存放到容器中
            self.xinFanPages.append(xinFan)
    # 打开指定新番
    def OpenXinFan03(self, index):
        # 获取指定的新番
        xinFan = self.xinFanPages[index]
        # print(xinFan)
        # 打开新番的网页
        self.open(xinFan.url)
        # 将新番的页面对象返回出去
        return xinFan
③编写blibli_xinfan_object03.py

代码如下:

from base_page.base_page import Base


# b站新番
class BliBliXinFan03(Base):
    # url
    url = None
    # 核心元素
    # 番剧的集数元素xpath
    el_xinFan_ji_Number = ("xpath", '//*[@class="mediainfo_mediaDesc__0JJwL"][2]/span[3]')
    # 新番右侧的选集最后一集元素xpath
    el_xinFan_ji_Number_right = ("xpath", '(//*[@class="numberListItem_title__ukPv0"])[last()]')
    # 新番的集数
    xinFan_ji_Number = None
    # 新番右侧的选集最后一集
    xinFan_ji_Number_right = None

    # 核心业务
    # 获取新番页的信息
    def GetInfor(self):
        # 切换到最新的页面
        self.switch()
        # 获取新番页面的集数和右侧的选集最后一集
        self.xinFan_ji_Number = self.locator(self.el_xinFan_ji_Number).text
        self.xinFan_ji_Number_right = self.locator(self.el_xinFan_ji_Number_right).text
④编写test03_case_jishu_right_jishu.py(任务3:运行此py文件)

代码如下:

import time
import re
import unittest
from selenium import webdriver
from page_object.blibli_index_object03 import BlibliIndex


class TestCase_GetxinFanInfor(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # 创建浏览器
        cls.driver = webdriver.Chrome()
        # 创建b站首页
        cls.blibli = BlibliIndex(cls.driver)
        time.sleep(1)
        # 打开b站番剧首页
        cls.blibliFanJu = cls.blibli.openBlibliFanju()
        time.sleep(1)
        # 获取b站番剧首页的新番信息
        cls.blibliFanJu.GetXinFanInfor()
        time.sleep(1)
    @classmethod
    def tearDownClass(cls):
        # 退出浏览器
        cls.driver.quit()

    def extract_number(self,string):
        """
        从字符串中提取数字
        """
        match = re.search(r'\d+', string)  # 匹配字符串中的数字
        if match:
            num = match.group()  # 取出匹配结果
            return num
        else:
            print("无集数")

    # 测试用例函数
    def test_OpenBliBliFanJu(self):
        a = [] #a存放新番首页的集数
        b = [] #b存放新番实际的集数
        # 循环打开所有的新番
        for i in range(len(self.blibliFanJu.xinFanPages)):
            # 打开指定的新番
            xinFan = self.blibliFanJu.OpenXinFan03(i)
            # 停留一段时间
            time.sleep(1)
            # 获取当前新番的信息
            xinFan.GetInfor()
            a.append(self.extract_number(xinFan.xinFan_ji_Number))
            b.append(xinFan.xinFan_ji_Number_right)
            try:
                self.assertEqual(self.extract_number(xinFan.xinFan_ji_Number), xinFan.xinFan_ji_Number_right)
            except AssertionError as e:
                print("第{}个测试不通过:第 {} 个新番的集数应该为 {},但实际为 {}".format(i+1,i+1,self.extract_number(xinFan.xinFan_ji_Number), xinFan.xinFan_ji_Number_right))
        print('存放新番首页显示的集数',a)
        print('存放新番实际的集数',b)

if __name__ == '__main__':
    unittest.main()
任务3运行结果图:

任务4:

①编写blibli_index_object04.py

代码如下:

# 核心业务流程
        # 打开b站首页
        # 点击番剧按钮,打开番剧页面
        #点击2022年的番剧页面
        #点击年份为2023的番剧按钮
        #点击按照“最高评分”进行排序
        # #把打开的番剧页面返回出去
from base_page.base_page import Base  # 导入基类---(理解:导入功能模块)
import time
from page_object.blibli_get_fanju_name_number04 import BliBliFanju04

# b站首页
class BlibliIndex(Base):
    # url
    url = "http://www.bilibili.com"
    # 核心元素
    el_button = ('xpath', '//*[@id="i_cecream"]/div[2]/div[1]/div[3]/div[2]/div/div[1]/a[1]')
    el_button_2022 = ('xpath', '// *[ @ id = "home_v3_mod_index"] / div / div[3] / div / div / div[2] / a[1]')
    el_button_2023 = ('xpath', '//*[@id="app"]/div[2]/div[2]/div[2]/div[8]/ul/li[2]')
    el_button_score_up = ('xpath', '//*[@id="app"]/div[2]/div[1]/ul[1]/li[3]/span')

    # 核心业务
    def openBlibliFanju(self):
        # 打开b站首页
        self.open(self.url)
        # 等待一段时间
        time.sleep(1)
        # 点击番剧按钮,打开番剧页面
        self.locator(self.el_button).click()
        time.sleep(3)
        #切换到当前窗口
        self.switch()
        time.sleep(1)
        #点击2022年的番剧页面
        self.locator(self.el_button_2022).click()
        time.sleep(2)
        # 切换到当前窗口
        self.switch()
        time.sleep(1)
        #点击2023年的番剧页面
        self.locator(self.el_button_2023).click()
        time.sleep(2)
        # 切换到当前窗口
        self.switch()
        #点击按照“最高评分”进行排序
        self.locator(self.el_button_score_up).click()
        time.sleep(1)
        # #把打开的番剧页面返回出去
        return BliBliFanju04(self.driver)
②编写blibli_get_fanju_name_number04.py

代码如下:

import re
from base_page.base_page import Base


# b站番剧首页
class BliBliFanju04(Base):
    # 核心元素
    # 每个番剧的评分元素xpath
    el_xinFan_score = ("xpath", '//*[@class="shadow"]')
    # 番剧第二页按钮元素xpath
    el_xinFan_two_page = ("xpath", '//*[@id="app"]/div[2]/div[1]/div/a[2]')

    # 存放1,2页每个番剧的评分
    xinFan_score = []

    from typing import List
    def extract_scores(self, data: List[str]) -> List[float]:
        """
        从包含评分字符串的列表中提取所有评分,并返回一个包含所有评分的列表。
        """
        pattern = r'(\d+\.\d+)分'
        scores = []
        for item in data:
            match = re.search(pattern, item)
            if match:
                score = float(match.group(1))
                scores.append(score)
        return scores

    # 核心业务
    # 测试评分排序是否正确
    def GetXinFanInfor04(self):
        # 切换当前页面
        self.switch()
        # 获取第1页的番剧评分
        temp = self.locators(self.el_xinFan_score)
        for i in range(len(temp)):
            self.xinFan_score.append(temp[i].text)

        # 点击第二页按钮进入第二页
        self.el_xinFan_two_page = self.locator(self.el_xinFan_two_page).click

        # 获取第2页的番剧评分
        temp = self.locators(self.el_xinFan_score)
        for i in range(len(temp)):
            self.xinFan_score.append(temp[i].text)
        print(self.xinFan_score)
        self.result = self.extract_scores(self.xinFan_score)
        self.original = self.result
        print('获取得到的列表', self.original)
        # 手动按最高评分排序
        self.result.sort(reverse=True)
        print('手动按最高评分排序后的列表', self.result)
        print('测试评分排序是否正确:', self.original == self.result)
③编写test04_case_score.py(任务4:运行此py文件)

代码如下:

import unittest
from selenium import webdriver
from page_object.blibli_index_object04 import BlibliIndex

class TestCase_OpenBliBliFanJu(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        # 创建浏览器
        cls.driver = webdriver.Chrome()
        # 创建b站首页
        cls.blibli = BlibliIndex(cls.driver)
        # 执行b站首页打开番剧页面的业务
        cls.blibliFanJu = cls.blibli.openBlibliFanju()
    @classmethod
    def tearDownClass(cls):
        # 退出浏览器
        cls.driver.quit()

    # 测试用例函数
    def test_OpenBliBliFanJu(self):
        # 执行b站番剧首页中 获取新番信息的业务
        self.blibliFanJu.GetXinFanInfor04()



if __name__ == '__main__':
    unittest.main()
任务4运行结果图:

任务5:

①编写blibli_index_object05.py

代码如下:

# 核心业务流程
        # 打开b站首页
        # 点击番剧按钮,打开番剧页面
        # #把打开的番剧页面返回出去
from base_page.base_page import Base  # 导入基类---(理解:导入功能模块)
import time
from page_object.blibli_get_fanju_name_number05 import BliBliFanju

# b站首页
class BlibliIndex(Base):
    # url
    url = "http://www.bilibili.com"
    # 核心元素
    el_button = ('xpath', '//*[@id="i_cecream"]/div[2]/div[1]/div[3]/div[2]/div/div[1]/a[1]')


    # 核心业务
    def openBlibliFanju(self):
        # 打开b站首页
        self.open(self.url)
        # 等待一段时间
        time.sleep(1)
        # 点击番剧按钮,打开番剧页面
        self.locator(self.el_button).click()
        time.sleep(3)
        # #把打开的番剧页面返回出去
        return BliBliFanju(self.driver)
②编写blibli_get_fanju_name_number05.py

代码如下:

import time
from base_page.base_page import Base
# b站番剧首页
class BliBliFanju(Base):
    # 核心元素
    # 推荐番剧下面的名称
    el_xinFan_down = ("xpath", '//*[@class="season-cover-title"]')
    # 推荐番剧上面的名称
    el_xinFan_up = ("xpath", '//*[@class="hover-title"]')

    # 存放两页番剧的追番人数
    xinFan_down = []
    xinFan_up = []

    # 核心业务

    # 获取“番剧首页”的页面上方推荐番剧两个区域的番剧名称
    def GetXinFanInfor05(self):
        # 切换当前页面
        self.switch()
        # 获取“番剧首页”的页面上方推荐番剧下区域的番剧名称
        temp = self.locators(self.el_xinFan_down)
        for i in range(len(temp)):
            self.xinFan_down.append(temp[i].text)
            # 获取“番剧首页”的页面上方推荐番剧上区域的番剧名称
            from selenium.webdriver.common.action_chains import ActionChains
            self.actions = ActionChains(self.driver)
            self.actions.move_to_element(temp[i]).perform()

            # 注意:要给获取第5和第6个番剧名称的时间设置长些,否则获取不到对应的名称
            if i == 5 or i == 6:
                time.sleep(3)
            self.xinFan_up.append(self.locator(self.el_xinFan_up).text)
            # 测试番剧名称是否一致
            print("第{}个测试番剧名称是否一致:{}".format(i, temp[i].text == self.locator(self.el_xinFan_up).text))
            time.sleep(0.5)
        print(self.xinFan_down)
        print(self.xinFan_up)
③编写test05_case.py(任务5:运行此py文件)

代码如下:

import time
import unittest
from selenium import webdriver
from page_object.blibli_index_object05 import BlibliIndex

class TestCase_OpenBliBliFanJu(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        # 创建浏览器
        cls.driver = webdriver.Chrome()
        # 创建b站首页
        cls.blibli = BlibliIndex(cls.driver)
        # 执行b站首页打开番剧页面的业务
        cls.blibliFanJu = cls.blibli.openBlibliFanju()
    @classmethod
    def tearDownClass(cls):
        # 退出浏览器
        cls.driver.quit()

    # 测试用例函数
    def test_OpenBliBliFanJu(self):
        # 执行b站番剧首页中 获取新番信息的业务
        self.blibliFanJu.GetXinFanInfor05()
        time.sleep(3)


if __name__ == '__main__':
    unittest.main()
任务5运行结果图:

任务完成啦!各位大佬,代码哪里需要完善,请多多指教。

I appreciate your support.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值