天天看点

python selenium po代码分层设计

上次写的被自己覆盖了,害的要重新写,内心有点崩溃
           

示例的github地址:https://github.com/moxiawujiang/UIAuto

 po设计模式(PageObject):自动化测试脚本的减少代码重复、更易读、减少维护成本

基础层---元素定位层--元素操作层--业务层--编写case--收集case并执行

项目结构如下

python selenium po代码分层设计

基础层: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='测试描述',
                                     # 支持中文与英文,默认中文
                                   )
    runner.run(mysuit)