白月黑羽教python之pytest:课后练习

本博客记录了白月黑羽教python的pytest课后作业的代码,方便以后查看,希望可以帮助看到这篇博客的人,最后感谢白月黑羽老师的免费教程,讲的非常清楚!

1、测试用例表

在这里插入图片描述

2、代码文件布局

在这里插入图片描述

3、代码

3.1 test_错误登录.py代码

# autotest\cases\登录\test_错误登录.py
import pytest
from lib.webui import *
from selenium import webdriver
from time import sleep

class Test_错误登录:
    @pytest.mark.parametrize('username, password, expectedalert', [
        (None, '88888888', '请输入用户名'),
        ('byhy', None, '请输入密码'),
        ('byh', '88888888', '登录失败 : 用户名或者密码错误'),
        ('byhy', '8888888', '登录失败 : 用户名或者密码错误'),
        ('byhy', '888888888', '登录失败 : 用户名或者密码错误'),
    ]
                             )
    def test_UI_0001_0005(self, username, password, expectedalert):
        alertText = loginAndCheck(username, password)
        assert alertText == expectedalert


class Test_检查菜单栏:
    def test_UI_0101(self):
        log=login()
        assert  log.title=='白月销售管理系统'
        menulist=checkMenu(log)
        assert menulist[0:3]==['客户','药品','订单']
        qq(log)


class Test_检查客户药品添加:
    def test_UI_0102(self):
        log=login()
        assert  log.title=='白月销售管理系统'
        addCustomsButton(log)
        addCustom(log,'南京中医院','12345678','南京中医院地址')
        assert checkCustomOrMedicineOrOrder(log,1)==['南京中医院','12345678','南京中医院地址']
        qq(log)

    def test_UI_0103(self):
        log=login()
        assert  log.title=='白月销售管理系统'
        addCustomsButton(log)
        addCustom(log,'南京中医院','12345678','南京中医院地址')
        editCustomName(log,'南京省中医院')
        assert checkCustomOrMedicineOrOrder(log,1)==['南京省中医院','12345678','南京中医院地址']
        qq(log)

    def test_UI_0105(self):
        log=login()
        assert  log.title=='白月销售管理系统'
        addMedicineButton(log)
        addMedicine(log,'青霉素盒装4','YP-32342344','青霉素注射液,每支15ml,20支装')
        assert checkCustomOrMedicineOrOrder(log,1) == ['青霉素盒装4','YP-32342344','青霉素注射液,每支15ml,20支装']
        qq(log)

    def test_UI_0107(self):
        log=login()
        assert  log.title=='白月销售管理系统'
        addMedicineButton(log)
        medicines=[
            ('青霉素盒装1','YP-32342341','青霉素注射液,每支15ml,20支装'),
            ('青霉素盒装2','YP-32342342','青霉素注射液,每支15ml,30支装'),
            ('青霉素盒装3','YP-32342343','青霉素注射液,每支15ml,40支装'),
        ]
        for i in medicines:
            addMedicine(log,i[0],i[1],i[2])
            assert checkCustomOrMedicineOrOrder(log,1) == [i[0],i[1],i[2]]
        addCustomsButton(log)
        customs=[
            ('南京中医院1', '2551867851', '江苏省-南京市-秦淮区-汉中路-501'),
            ('南京中医院2', '2551867852', '江苏省-南京市-秦淮区-汉中路-502'),
            ('南京中医院3', '2551867853', '江苏省-南京市-秦淮区-汉中路-503'),
        ]
        for j in customs:
            addCustom(log,j[0],j[1],j[2])
            assert checkCustomOrMedicineOrOrder(log,1)==[j[0],j[1],j[2]]
        addOrderButton(log,)
        addOrder(log,None,'南京中医院2','青霉素盒装1','100')
        assert checkCustomOrMedicineOrOrder(log,0)==['','南京中医院2','青霉素盒装1 * 100']
        qq(log)

    def test_UI_0108(self):
        log=login()
        assert  log.title=='白月销售管理系统'
        checkEmpty(log)
        addMedicineButton(log)
        medicines = [
            ('青霉素盒装1', 'YP-32342341', '青霉素注射液,每支15ml,20支装'),
            ('青霉素盒装2', 'YP-32342342', '青霉素注射液,每支15ml,30支装'),
            ('青霉素盒装3', 'YP-32342343', '青霉素注射液,每支15ml,40支装'),
        ]
        for i in medicines:
            addMedicine(log,i[0], i[1], i[2])
            assert checkCustomOrMedicineOrOrder(log,1) == [i[0], i[1], i[2]]
        addCustomsButton(log)
        customs = [
            ('南京中医院1', '2551867851', '江苏省-南京市-秦淮区-汉中路-501'),
            ('南京中医院2', '2551867852', '江苏省-南京市-秦淮区-汉中路-502'),
            ('南京中医院3', '2551867853', '江苏省-南京市-秦淮区-汉中路-503'),
        ]
        for j in customs:
            addCustom(log,j[0], j[1], j[2])
            assert checkCustomOrMedicineOrOrder(log,1) == [j[0], j[1], j[2]]
        addOrderButton(log)
        addOrder(log,None, '南京中医院2', '青霉素盒装1', '100')
        assert checkCustomOrMedicineOrOrder(log,0) == ['', '南京中医院2', '青霉素盒装1 * 100']
        qq(log)

class Test_检查跳转:
    def test_UI_0106(self):
        log=login()
        assert  log.title=='白月销售管理系统'
        assert jump(log)==[['Python基础','Python进阶','图形界面','Web开发','自动化测试','性能测试','常见问题','其它'],'http://127.0.0.1/mgr/sign.html']
        qq(log)

3.2 webui.py代码

# lib\webui.py
from selenium import webdriver
from time import sleep
# 导入Select类
from selenium.webdriver.support.ui import Select

def loginAndCheck(username,password):
    driver = webdriver.Chrome(r'I:\chromedriver_win32\chromedriver.exe')
    driver.implicitly_wait(10)
    driver.get('http://127.0.0.1/mgr/sign.html')
    driver.maximize_window()
    if username is not None:
        driver.find_element_by_id('username').send_keys(username)
    if password is not None:
        driver.find_element_by_id('password').send_keys(password)
    driver.find_element_by_css_selector("button[type='submit']").click()
    sleep(2)
    alertText=driver.switch_to.alert.text
    driver.quit()
    return alertText

def login():
    driver = webdriver.Chrome(r'I:\chromedriver_win32\chromedriver.exe')
    driver.implicitly_wait(10)
    driver.get('http://127.0.0.1/mgr/sign.html')
    driver.maximize_window()
    # 登录白月黑羽系统
    driver.find_element_by_id('username').send_keys('byhy')
    driver.find_element_by_id('password').send_keys('88888888')
    driver.find_element_by_tag_name('button').click()
    sleep(2)
    return driver

def qq(driver):
    driver.quit()

def checkMenu(driver):
    elementsidebar = driver.find_element_by_class_name('sidebar')
    elementlist = elementsidebar.find_elements_by_tag_name('span')
    menutext=[]
    for ele in elementlist:
        menutext.append(ele.text)
    return menutext

def addCustomsButton(driver):
    sleep(1)
    driver.find_element_by_css_selector('[href="#/customers"]').click()
    sleep(1)
    driver.find_element_by_css_selector('.col-lg-12 button').click()
    sleep(1)

def addCustom(driver,name,telenum,address):
    if name is not None:
        sleep(1)
        driver.find_element_by_css_selector('div.col-lg-8> div:nth-child(1)>input').send_keys(f'{name}')
    if telenum is not None:
        sleep(1)
        driver.find_element_by_css_selector('div.col-lg-8> div:nth-child(2)>input').send_keys(f'{telenum}')
    if telenum is not None:
        sleep(1)
        driver.find_element_by_css_selector('div textarea').send_keys(f'{address}')
    sleep(1)
    driver.find_element_by_css_selector('div>div.col-lg-12>button:nth-child(1)').click()

def checkCustomOrMedicineOrOrder(driver,nth):
    cusOrMedinfor=[]
    sleep(1)
    cusOrMedinfor.append(driver.find_element_by_css_selector(
        f'div.search-result-item:nth-child(3)>div:nth-child(1)>span:nth-child(2)').text)
    if nth == 1:
        sleep(1)
        cusOrMedinfor.append(driver.find_element_by_css_selector(
            f'div.search-result-item:nth-child(3)>div:nth-child(2)>span:nth-child(2)').text)
    sleep(1)
    cusOrMedinfor.append(driver.find_element_by_css_selector(
        f'div.search-result-item:nth-child(3)>div:nth-child(3)>span:nth-child(2)').text)
    if nth==0:
        sleep(1)
        cusOrMedinfor.append(driver.find_element_by_css_selector(
            f'div.search-result-item:nth-child(3)>div:nth-child(4)>p:nth-child(2)').text)
    return cusOrMedinfor

def editCustomName(driver,newName):
    sleep(1)
    driver.find_element_by_css_selector(
        'label.btn-green.btn-outlined.btn-xs').click()
    sleep(2)
    ele=driver.find_element_by_css_selector(
        ' .search-result-item  div:nth-child(1) >input')
    ele.clear()
    sleep(1)
    ele.send_keys(f'{newName}')
    sleep(2)
    driver.find_element_by_css_selector(
        'div:nth-child(3) > div.search-result-item-actionbar > div > label:nth-child(1)').click()

def addMedicineButton(driver):
    sleep(1)
    driver.find_element_by_css_selector('[href="#/medicines"]').click()
    sleep(1)
    driver.find_element_by_css_selector('.col-lg-12>button').click()
    sleep(1)

def addMedicine(driver,medicineName,medicineNum,medicineDescription):
    # 点击【添加药品】按钮css
    sleep(1)
    driver.find_element_by_css_selector('.col-lg-8>:nth-child(1)>input').send_keys(f'{medicineName}')
    sleep(1)
    driver.find_element_by_css_selector('.col-lg-8>:nth-child(2)>input').send_keys(f'{medicineNum}')
    sleep(1)
    driver.find_element_by_css_selector('.col-lg-8>:nth-child(3)>textarea').send_keys(f'{medicineDescription}')
    sleep(1)
    driver.find_element_by_css_selector('.col-lg-12>.btn-xs:nth-child(1)').click()

def jump(driver):
    # 点击外链之前先保存本页面句柄
    mainwindow = driver.current_window_handle
    # 点击外链
    driver.find_element_by_css_selector('.pull-right>[href="http://www.python3.vip"]').click()
    # 寻找所选外链
    for handle in driver.window_handles:
        driver.switch_to.window(handle)
        if '白月黑羽教Python' in driver.title:
            break
    barelements = driver.find_elements_by_css_selector('li.nav-item span')
    otherLinkmenu=[]
    for barelement in barelements:
        otherLinkmenu.append(barelement.text)
    driver.switch_to.window(mainwindow)
    driver.find_element_by_css_selector('span.hidden-xs').click()
    driver.find_element_by_css_selector('.pull-right a.btn').click()
    sleep(2)
    curlink= driver.current_url
    res=[otherLinkmenu,curlink]
    return res

def addOrderButton(driver):
    driver.find_element_by_css_selector('[href="#/orders"] span').click()
    sleep(2)

def addOrder(driver,orderName,name,medicionName,num):
    # 添加订单
    driver.find_element_by_css_selector('.col-lg-12 span').click()
    if orderName is not None:
        driver.find_element_by_css_selector('.col-lg-8 div:nth-child(1) input').send_keys(f'{orderName}')
    # 创建Select对象
    select1 = Select(driver.find_element_by_css_selector(".col-lg-8 div:nth-child(2) .xxx"))
    sleep(1)
    select1.select_by_visible_text(f'{name}')
    select2 = Select(driver.find_element_by_css_selector(".col-lg-8 div:nth-child(3) .xxx"))
    sleep(1)
    select2.select_by_visible_text(f'{medicionName}')
    driver.find_element_by_css_selector("input[type='number']").send_keys(f'{num}')
    driver.find_element_by_css_selector('button.btn-xs:nth-child(1)').click()

def checkEmpty(driver):
    addOrderButton(driver)
    orders_had = driver.find_elements_by_xpath('//div[@class="search-result-item"]')
    while orders_had:
        for order_had in orders_had:
            sleep(3)
            order_had.find_element_by_xpath('./div[5]//label').click()
            sleep(3)
            driver.switch_to.alert.accept()
        sleep(3)
        orders_had = driver.find_elements_by_xpath('//div[@class="search-result-item"]')
    sleep(2)
    addMedicineButton(driver)
    # 没订单有药品时,删除药品
    medicines = driver.find_elements_by_xpath('//div[@class="search-result-item-actionbar"]')
    while medicines:
        for medicine in medicines:
            sleep(3)
            medicine.find_element_by_xpath('.//label[2]').click()
            sleep(3)
            driver.switch_to.alert.accept()
        sleep(3)
        medicines = driver.find_elements_by_xpath('//div[@class="search-result-item-actionbar"]')
    sleep(2)
    addCustomsButton(driver)
    # 没订单有客户时,删除客户
    customers = driver.find_elements_by_xpath('//div[@class="search-result-item-actionbar"]')
    while customers:
        for customer in customers:
            sleep(3)
            customer.find_element_by_xpath('.//label[2]').click()
            sleep(3)
            driver.switch_to.alert.accept()
        sleep(3)
        customers = driver.find_elements_by_xpath('//div[@class="search-result-item-actionbar"]')
    sleep(2)

4、注意点

1、TypeError:'module’object is not callable
在这里插入图片描述
解决方法:将 driver=webdriver.chrom() 中的chrom修改为Chrom。
参考:https://blog.csdn.net/Angelia620/article/details/106339407
2、selenium.common.exceptions.sessionNotcreatedException:Message:session not created:This version of Chromepriver only supports chrome version 79
在这里插入图片描述
解决方法:pytest默认浏览器驱动与你使用的浏览器版本不匹配,需要自己下载对应驱动,使用时添加相应路径。
driver=webdriver.Chrom()修改为 driver = webdriver.Chrome(r'I:\chromedriver_win32\chromedriver.exe')
3、AttributeError:'function’object has no attribute ‘text’
在这里插入图片描述
解决方法:driver.title可获取当前页面的<title>一些文本</title>中的文本,而不是定位title元素使用text方法。
4、urllib3.exceptions.MaxRetryError:HTTPConnectionPool: Max retries exceeded with url
分析原因:
Case I.端口被占用所致
Case II.采用爬虫工具selenium中,提前quit()(类似于<关闭服务>)后,又请求webdriver服务引起
解决方法:一般是第二种情况,合理调用driver.quit()函数
参考:https://blog.csdn.net/weixin_44617364/article/details/105860789?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase
5、Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)

Frame/Iframe原因定位不到元素
Xpath描述错误原因
页面还没有加载出来,就对页面上的元素进行的操作
动态id定位不到元素
二次定位,如弹出框登录
不可见元素定位

自己目前遇到定位不到元素的情况,一般是5.3情况(页面还没有加载出来,就对页面上的元素进行的操作),引入sleep()即可
参考:https://www.cnblogs.com/yufeihlf/p/5689042.html
6、pytest的一个bug: 清除操作并不一定会在该目录最后一个测试用例执行完进行调用。
pytest目录级别初始化:
在这里插入图片描述
但是不是应该是下面这种格式呢:
在这里插入图片描述
7、python中yield的用法

python中yield的用法详解

5、知识总结

在这里插入图片描述

感觉代码还是不够简洁,封装不够好。

我很抱歉,我不了解“白月黑羽”提供的Python教程。然而,Python是一门广泛使用的编程语言,有许多资源可供学习。以下是一些常用的Python学习资源: 1. 官方文档:Python官方网站提供了详细的官方文档,其中包含了Python的语法、模块和标准库的说明。您可以访问官方网站(https://www.python.org)并查看相关文档。 2. 在线教程:有许多免费的在线Python教程可供选择。一些受欢迎的在线教育平台,如Coursera、Udemy和Codecademy,提供了Python编程课程。您可以在这些平台上搜索并选择适合您的课程。 3. 图书:有很多优秀的Python编程书籍可供学习。一些经典的Python入门书籍包括《Python编程快速上手——让繁琐工作自动化》、《Python编程从入门到实践》等。您可以通过在线书店或图书馆获取这些书籍。 4. 社区和论坛:加入Python开发者社区和论坛,与其他Python爱好者交流和学习。可以参加Python开发者大会,订阅Python相关的邮件列表或加入在线论坛如Stack Overflow来获取帮助和经验分享。 5. 实践项目:通过实际编写代码来提高您的Python编程能力。尝试解决一些小项目或参与开源项目,这将帮助您应用所学的知识并提升技能。 请记住,学习编程需要持续的练习和实践。从基础知识开始,逐渐深入学习,并通过编写代码来巩固所学的内容。祝您在学习Python的过程中取得成功!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值