本博客记录了白月黑羽教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的用法
5、知识总结
感觉代码还是不够简洁,封装不够好。