上次写的被自己覆盖了,害的要重新写,内心有点崩溃
示例的github地址:https://github.com/moxiawujiang/UIAuto
po设计模式(PageObject):自动化测试脚本的减少代码重复、更易读、减少维护成本
基础层---元素定位层--元素操作层--业务层--编写case--收集case并执行
项目结构如下
基础层:base_page.py中封装 一些selenium的基本操作,如元素定位、输入、清除、获取元素text等操作方法
_author__ = '芜疆'
#encoding=utf-8
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from unittest import TestCase
class BasePage:
def __init__(self,driver):
self.driver =driver
#封装定位方式
def find_element(self,*args):
try:
return WebDriverWait(self.driver, 5, 0.5).until(EC.visibility_of_element_located(*args))
except Exception as e:
raise e
def find_elements(self,*loc):
try:
return WebDriverWait(self.driver, 5, 0.5).until(EC.visibility_of_any_elements_located(*loc))
except Exception as e:
raise e
#打开网址
def visit_url(self,url='填入默认地址'):
self.driver.get(url)
'''元素操作封装 '''
#点击元素
def click_element(self,element):
element.click()
#元素输入
def sendkey_element(self,element,values):
element.send_keys(values)
#获取元素的值
def get_element_value(self,element):
return element.text
#清空元素
def clear_element(self,element):
element.clear()
#获取某个元素的属性
def get_element_attribute(self,element,attribute):
return element.get_attribute(attribute)
'''断言封装'''
#校验是否为真
def assert_True(self,key):
TestCase().assertTrue(key)
#校验是否为假
def assert_False(self,key):
TestCase().assertFalse(key)
#校验是否相等
def assert_Equal(self,key1,key2):
TestCase().assertEqual(key1,key2)
#校验是否不相等
def assert_Not_Equal(self,key1,key2):
TestCase().assertNotEqual(key1,key2)
#校验页面是否存在某字符串
def check_exist_in_page(self,str):
self.assert_True( str in self.driver.page_source)
现在写login page页面上的东西
元素定位层:login_page.py 中 主要是定位到元素
元素操作层:login_page.py 中 元素的操作,点击、输入、还是获取值等
业务层:login_page.py 中 封装一些流程,比如登录流程,另外我还封装了一些校验
from common.BasePage import BasePage
from selenium.webdriver.common.by import By
#继承于Basepage
class LoginPage(BasePage):
#元素定位信息
_name=(By.XPATH,"//input[@placeholder='用户名']")
_password=(By.NAME,"password")
_login_botton=(By.XPATH,"//input[@value='登入']")
def __init__(self, driver):
BasePage.__init__(self, driver)
'''
元素定位层
'''
#获取用户名元素
def get_username(self):
return self.find_element(self._name)
#获取密码元素
def get_password(self):
return self.find_element(self._password)
#获取登录按钮
def get_login_button(self):
return self.find_element(self._login_botton)
'''
元素操作层
'''
#对用户名进行输入
def sendkey_username(self,name):
return self.sendkey_element(self.get_username(),name)
#对密码进行输入
def sendkey_password(self,password):
return self.sendkey_element(self.get_password(),password)
#点击登录按钮
def click_login_button(self):
return self.click_element(self.get_login_button())
'''
业务层
'''
#封装登录流程
def login(self,username,password):
self.sendkey_username(username) #输入用户名
self.sendkey_password(password) #输入密码
self.click_login_button() # 点击登录按钮
#检查是否在登录页面
def check_isloginpage(self):
list = ["用户名", '密码', '登入']
for text in list:
self.check_exist_in_page(text)
#登录失败校验
def check_exist_failmsg(self):
list = ["无效证书"]
for text in list:
self.check_exist_in_page(text)
页面写完之后,就该写case了,在login_case.py里面如下
#coding=utf-8
__author__ = 'wujiang'
from selenium import webdriver
import unittest
from ddt import *
from common.BasePage import BasePage
from pages.login_page import LoginPage
from pages.home_page import HomePage
@ddt
class LoginTest(unittest.TestCase):
'''登录测试'''
def setUp(self):
self.driver =webdriver.Chrome()
self.driver.implicitly_wait(5)
BasePage(self.driver).visit_url()
def tearDown(self) :
self.driver.quit()
#登录测试
@data(("user002","user003"),("user003","user003"))
@unpack
@get_screen_in_case_end_or_error
def test_login001(self,username,password):
self._testMethodDoc='''普通用户登录成功'''
LoginPage(self.driver).login(username,password)
#校验登录后的用户名
HomePage(self.driver).check_username(username)
#校验登录后没有控制台权限
HomePage(self.driver).check_user_auth(2)
@get_screen_in_case_end_or_error
def test_login002(self):
self._testMethodDoc='''admin用户登录成功'''
LoginPage(self.driver).login('admin','admin')
#校验登录后的用户名
HomePage(self.driver).check_username('admin')
#校验登录后没有控制台权限
HomePage(self.driver).check_user_auth(1)
@data((123456,123456),("user002",'123456'))
@unpack
@get_screen_in_case_end_or_error
def test_login003(self,username,password):
self._testMethodDoc='''登录失败'''
LoginPage(self.driver).login(username, password)
#校验存在登录失败的提示信息
LoginPage(self.driver).check_exist_failmsg()
@get_screen_in_case_end_or_error
def test_loginout(self):
self._testMethodDoc='''退出登录'''
#用户登录
LoginPage(self.driver).login('user002', 'user003')
#用户退出
HomePage(self.driver).loginout()
#检查是否在登录页面
LoginPage(self.driver).check_isloginpage()
case写完之后,就是收集测试用例,执行测试的代码,在runner.py里面
__author__ = '芜疆'
#coding=utf-8
import time
import unittest
import HTMLReport
import os
import sys
os.chdir(sys.path[0])
#收集测试用例
def create_my_suit():
my_suit=unittest.TestSuite()
testdir="test_case"
discover=unittest.defaultTestLoader.discover(testdir,pattern="*case.py",top_level_dir=None)
for test_suit in discover:
for test_case in test_suit:
my_suit.addTest(test_case)
return my_suit
if __name__ == '__main__':
#time=time.strftime("%y-%m-%d %H-%M-%S")
mysuit=create_my_suit()
runner = HTMLReport.TestRunner(report_file_name='report',
output_path='report',
title='测试报告',
description='测试描述',
lang='cn' # 支持中文与英文,默认中文
)
runner.run(mysuit)