UI自动化测试实战之页面对象设计模式(po模式)
1、创建可以跨多个测试用例共享代码
2、减少重复的代码
3、如果用户界面发生了维护,我们只需要维护一个地方,这样修改以及维护的成本相对来说是比较低的
data:主要存储的是测试过程中使用到的数据
report:该文件主要是存储报告测试的
2、目录结构设计:
框架的目录结构的设计
3、基础层
下面主要实现基础层的代码,在base包下创建名为base.py的文件,里面的代码为
from selenium import webdriver from selenium.webdriver.common.by import By '''导入元素定位方法''' from selenium.webdriver.support.expected_conditions import NoSuchFrameException import time as t class WebUI(): '''元素定位发''' def __init__(self,driver): '''web实例化后的对象''' self.driver=driver '''固定格式必须元组''' def findElement(self,*ages): ''' 单个元素定位的方式 :param ages: :return: 他是一个元组,需要带上具体什么方式定位元素以及元素属性的值 ''' try: return self.driver.find_element(*ages) except NoSuchFrameException as e: return e.args[0] def findsElement(self,*ages,index): ''' 单个元素定位的方式 :param ages: :param index:被定为的目标索引位置 :return: 他是一个元组,需要带上具体什么方式定位元素以及元素属性的值 ''' try: return self.driver.find_element(*ages)[index] except NoSuchFrameException as e: return e.args[0]
4、对象层
下面以sina的邮箱案例练编写具体的代码,在page包下创建一个login.py的文件,里面的代码为:
from selenium.webdriver.common.by import By from base.base import WebUI import time as t class Login(WebUI): '''登录继承base里面我们写的元素定位方法↑''' username=(By.ID,'freename') '''用户名↑''' password=(By.ID,'freepassword') '''密码↑''' login=(By.CLASS_NAME,'loginBtn') '''登录↑''' divText=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]') looText=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[2]') def inputUserName(self,username): # 输入账户值↑ t.sleep(2) self.findElement(*self.username).send_keys(username) def inputPassword(self,password): # 输入密码值↑ t.sleep(2) self.findElement(*self.password).send_keys(password) def clickLogin(self): # 点击登录 self.findElement(*self.login).click() def getDivText(self): # 获取错误提示 return self.findElement(*self.divText).text def getLooText(self): return self.findElement(*self.looText).text def sianLogin(self,username,password): self.inputUserName(username=username) self.inputPassword(password=password) self.clickLogin()
5、测试层
下来再测试层,也就是test包下创建的test_login.py的模块来执行,切记,需要执行验证下我们编写的具体测试用例。
先将测试固件分离
我们已经学会了数据驱动的分离,接下来我们将针对测试固件进行分离,在page包下创建Init.py文件,里面的代码如下
from selenium import webdriver import unittest class Init(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://mail.sina.com.cn/#') self.driver.implicitly_wait(30) def tearDown(self) -> None: self.driver.quit()
再写测试用例,此时就可以直接继承刚才编写的测试固件了
from page.login import Login import time as t from page.Init import Init '''1、先继承测试固件''' class LoginTest(Init,Login): '''2、编写测试用例''' def test_login_null(self): '''登录:验证账户为空返回的值''' self.sianLogin(username='',password='') t.sleep(3) self.assertEqual(self.getDivText(),'请输入邮箱名') def test_login_format(self): '''登录:验证邮箱名格式不正确''' self.sianLogin(username='fbajfa',password='sajlnfls') t.sleep(3) self.assertEqual(self.getDivText(), '您输入的邮箱名格式不正确') def test_login_error(self): '''登录:验证登录账户或密码错误''' self.sianLogin(username='dnana@sina.com',password='ajaja') t.sleep(3) self.assertEqual(self.getDivText(), '登录名或密码错误') def test_login_loo(self): '''登录:验证只输入邮箱号不输入密码的错误''' self.sianLogin(username='asjkaskj@sina.com',password='') t.sleep(3) self.assertEqual(self.getLooText(),'请输入密码') def test_login_biao(self): '''登录:验证邮箱输入标点符号''' self.sianLogin(username='adnl,da@sina.com',password='bkda') t.sleep(3) self.assertEqual(self.getDivText(),'您输入的邮箱名格式不正确')