Python+Selenium+unittest+PageObject设计模式——登录实例

1. 项目结构

    项目结构如图

    data目录下放的是测试相关的数据;report目录下放的是测试报告和错误截图;test_case目录存放的是测试用例和相关模块。models目录中存放的是一些公共函数和类,pageObj目录中存放的是基本类和测试页面类,a_login_sta.py为测试用例文件。

Python+Selenium+unittest+PageObject设计模式——登录实例_第1张图片

2. driver.py

    启动浏览器驱动

from selenium import webdriver

def test_browser():
    driver = webdriver.Chrome()
    return driver

if __name__ == '__main__':
    dr = test_browser()
    dr.get('http://.........')
    dr.quit()

3. myunit.py

from driver import test_browser
import unittest

class TestClass(unittest.TestCase):
    def setUp(self):
        self.driver = test_browser()
        self.driver.maximize_window()

    def tearDown(self):
        self.driver.quit()

4. function.py

    参考文章https://blog.csdn.net/Missshi/article/details/103874916

5. base.py

# 创建基础类
class Page(object):
    crm_url = 'http://.........'

    # 初始化
    def __init__(self, driver, base_url=crm_url):
        self.base_url = base_url
        self.driver = driver
        self.timeout = 30

    # 定义打开页面方法
    def __open(self):
        url = self.base_url
        self.driver.get(url)

    # 定义open方法,调用__open方法
    def open(self):
        self.__open()

    # 定义定位方法
    def find_element(self, *loc):
        return self.driver.find_element(*loc)

    def find_elements(self, *loc):
        return self.driver.find_elements(*loc)

6. loginPage.py

    创建登录页面对象,对页面上的元素定位做一个封装,另外定义统一的登录方法。

from selenium.webdriver.common.by import By
from base import Page
import time

#创建登录页面类
class loginPage(Page):
    username_loc = (By.CSS_SELECTOR, ".form-label:nth-child(1) .input-class")
    password_loc = (By.CSS_SELECTOR, ".form-label:nth-child(2) .input-class")
    login_loc = (By.CSS_SELECTOR, ".submit-btn")

    #输入用户名
    def type_username(self, username):
        self.find_element(*self.username_loc).send_keys(username)

    #输入密码
    def type_password(self, password):
        self.find_element(*self.password_loc).send_keys(password)

    #点击登录
    def type_login(self):
        self.find_element(*self.login_loc).click()

    #查找断言需要的字段
    user_login_success_loc = (By.CSS_SELECTOR, "#user-menu-btn > .user-name")
    def user_login_success(self):
        return self.find_element(*self.user_login_success_loc).text

    #定义统一登录方法
    def user_login(self, username='...', password='.....'):
        self.open()
        self.type_username(username)
        self.type_password(password)
        self.type_login()
        time.sleep(5)

7. a_login_sta.py

    创建测试用例类,TestLogin继承了myunit的TestClass类,这样就每次都会执行setUp和tearDown。

import time, unittest
from test_case.models import myunit, function
from test_case.pageObj.loginPage import loginPage

class TestLogin(myunit.TestClass):
    '''登录测试'''
    def user_login_verify(self, username='', password=''):
        loginPage(self.driver).user_login(username, password)

    def test_login(self):
        self.user_login_verify(username='....',password='.....')
        # 判断是否登录成功
        time.sleep(10)
        po = loginPage(self.driver)
        try:
            #此处用到loginPage.py中的查找断言元素的方法
            self.assertEqual(po.user_login_success(), "系统管理员")
        except Exception as e:
            #如果断言失败则截图,调用function.py中的截图方法
            function.test_takeScreenshot(self.driver, function.test_currentTime())

if __name__ == '__main__':
    unittest.main()

8. run_crm.py

    执行测试用例文件,参考文章https://blog.csdn.net/Missshi/article/details/103875304

你可能感兴趣的:(UI自动化)