多账号登录系统完成业务流程测试
工作中我们做UI自动化测试时,我们的自动化测试用例往往都是针对完整的业务流程的,而有的业务流程可能涉及到多个角色,而每个角色需要有对应的账号,这种情况下想要完成整个业务流程的测试就需要切换不同的账号,本文中我将分享一个多个账号切换登录的案例。
我们以禅道系统为例,以测试人员创建bug,开发人员确认bug这个流程为例来演示多账号登录系统并执行不同环节来完成整个流程。
整体思路是这样的,在conftest中封装一个fixture函数,在这个函数中实现用户的登录过程,我们设置一个默认账户(admin),这个fixture函数没有传入账户时,就使用默认账户登录系统,并返回该用户对应的page对象,这样可以满足单用户操作的业务流程的测试。当给fixture函数传入一个用户列表时,就可以按照用户列表来逐个登录,每个用户都有一个对应的page对象,fixture函数最后返回的是这些page对象的列表。
conftext中fixture函数实现代码:
# '''
# author=测试-老姜 交流微信/QQ:349940839
# 欢迎添加微信或QQ,加入学习群共同学习交流。
# QQ交流群号:877498247
# 西安的朋友欢迎当面交流。
# '''
import pytest
from _48_chandao_login_page import chandao_login_Page
from playwright.sync_api import Playwright, sync_playwright, expect
def login_sys(playwright,username,password,browser):
# 定义登录过程
if browser == 'chrome':
browser = playwright.chromium.launch(headless=False,slow_mo=1000) #默认无头模式
elif browser == 'firefox':
browser = playwright.firefox.launch(headless=False,slow_mo=1000) #默认无头模式
context = browser.new_context() # 创建上下文,相当浏览器于实例化,即打开浏览器
page = context.new_page() # 打开一个新标签页
lp = chandao_login_Page(page)
lp.goto_login_page()
lp.login_chandao(username,password)
return context,browser,page
@pytest.fixture(scope='session',params=['admin'])
def login_by_user(request):
#定义一个用户列表,实际应用中可以写在配置文件中
#使用禅道作为案例,禅道不允许同一个浏览器登录多个账户,不同账户采用不同浏览器登录
user_list = {'admin':{'username':'admin','password':'Deshifuzhi01','browser':'chrome'},
'user2':{'username':'abc','password':'Deshifuzhi01','browser':'firefox'}}
user = request.param
print(user,"@@@")
if user == 'admin': # 默认账户
user_info = user_list[user]
playwright = sync_playwright().start()
context,browser,page = login_sys(playwright,user_info['username'],user_info['password'],user_info['browser'])
yield page
context.close()
browser.close()
playwright.stop()
elif type(user) is list: #如果是列表则说明要登录多个账户
close_li = []
page_li = []
playwright = sync_playwright().start()
for u in user: # 循环遍历用户列表,逐个登录
print(u,"***")
user_info = user_list[u]
context,browser,page = login_sys(playwright,user_info['username'],user_info['password'],user_info['browser'])
close_li.append([context,browser])
page_li.append(page)
yield page_li # 返回每个用户的page对象组成的列表
for close in close_li: # 逐个关闭context对象和browser对象
close[0].close()
close[1].close()
playwright.stop()
接下来封装创建bug页面类,创建bug时简化一下过程,只填写必填项,并选择bug的指派人员。后面将有这个指派人员登录系统完成bug确认。
创建bug页面类实践代码
# '''
# author=测试-老姜 交流微信/QQ:349940839
# 欢迎添加微信或QQ,加入学习群共同学习交流。
# QQ交流群号:877498247
# 西安的朋友欢迎当面交流。
# '''
import _44_aw as aw
from playwright.sync_api import Page,sync_playwright
class creatbug_Page():
def __init__(self,page:Page) -> None:
self.page=page
self.frame = '#appIframe-qa'
self.yingxiangbanben = '#pk_openedBuild-search'
self.zhugan = '#pk_openedBuild-item-dHJ1bms--option'
self.dangqianzhipai = '#assignedTo_chosen'
self.zhipairen = '[title="A:ABC"][data-option-array-index="1"]'
self.title = 'input[name=\"title\"]'
self.baocun = '#submit'
def goto_creatbug_page(self):
#进入登录页面
self.page.goto("http://127.0.0.1/zentao/bug-create-2-all-moduleID=0.html")
def creat_bug(self,title):
aw.locat_frame_element_click(self.page,self.frame,self.yingxiangbanben)
aw.locat_frame_element_click(self.page,self.frame,self.zhugan)
aw.locat_frame_element_click(self.page,self.frame,self.dangqianzhipai)
aw.locat_frame_element_click(self.page,self.frame,self.zhipairen)
aw.locat_frame_element_fill(self.page,self.frame,self.title,title)
aw.locat_frame_element_click(self.page,self.frame,self.baocun)
创建bug页面类封装完成后,接下来封装我的bug页面类
我的bug页面类实践代码:
# '''
# author=测试-老姜 交流微信/QQ:349940839
# 欢迎添加微信或QQ,加入学习群共同学习交流。
# QQ交流群号:877498247
# 西安的朋友欢迎当面交流。
# '''
import _44_aw as aw
from playwright.sync_api import Page,sync_playwright
class mybug_Page():
def __init__(self,page:Page) -> None:
self.page=page
self.frame = '#appIframe-my'
self.queren = '[href="/zentao/bug-confirmBug-11.html?onlybody=yes"][title="确认"]'
self.queren_iframe = '#iframe-triggerModal'
self.baocun = '#submit'
def goto_mybug_page(self):
#进入登录页面
self.page.goto("http://127.0.0.1/zentao/my-work-bug.html")
def queren_bug(self):
aw.locat_frame_element_click(self.page,self.frame,self.queren)
aw.locat_frame_element_click(self.page,[self.frame,self.queren_iframe],self.baocun)
当所有涉及的页面类封装完成后,我们来写测试用例
实践代码:
# '''
# author=测试-老姜 交流微信/QQ:349940839
# 欢迎添加微信或QQ,加入学习群共同学习交流。
# QQ交流群号:877498247
# 西安的朋友欢迎当面交流。
# '''
import pytest
from _46_creatbug_page import creatbug_Page
from _47_mybug_page import mybug_Page
class Test_Bug_LiuCheng():
user_li = [['admin','user2']]
@pytest.mark.parametrize('login_by_user',user_li,indirect=True)
def test_bug_queren(self,login_by_user):
page = login_by_user
cp = creatbug_Page(page[0]) # 第一个用户创建bug
cp.goto_creatbug_page()
cp.creat_bug('这是案例')
mp = mybug_Page(page[1]) # 第二个用户确认bug
mp.goto_mybug_page()
mp.queren_bug()
if __name__=='__main__':
case_path = r'D:\jnc\自动化测试\playwright\playwright_project\test_bug_liucheng.py'
pytest.main(['-s',case_path])