UI自动化测试框架-POM模式

发布时间 2023-07-04 05:07:33作者: 天才九少

Page Object Model (POM) 直译为“页面对象模型”,这种设计模式旨在为每个待测试的页面创建一个页面对象(class),将那些繁琐的定位操作封装到这个页面对象中,只对外提供必要的操作接口

示例:

文件目录:

login_page.py

"""
登录页面
"""
from selenium.webdriver.common.by import By

from AutoTestPom.utils import DriverUtil


class LoginPage(object):
    """登录对象层"""

    def __init__(self):
        self.driver = DriverUtil.get_driver()                 # 获取浏览器对象
        self.name = (By.XPATH, '//*[@id="username"]')         # 密码
        self.pwd = (By.XPATH, '//*[@id="password"]')          # 密码
        self.btn = (By.XPATH, '//*[@id="loginBtn"]')          # 登录按钮

    def find_username(self):
        """定位用户名方法"""
        return self.driver.find_element(self.name[0], self.name[1])

    def find_password(self):
        """定位密码方法"""
        return self.driver.find_element(self.pwd[0], self.pwd[1])

    def find_login_btn(self):
        """定位登录按钮方法"""
        return self.driver.find_element(self.btn[0], self.btn[1])


class LoginHandle(object):
    """登录操作层"""
    def __init__(self):
        self.login_page = LoginPage()   # 获取对象层对象

    def input_username(self, name):
        """输入用户名方法"""
        # 执行输入操作前,先执行清空操作
        self.login_page.find_username().clear()
        self.login_page.find_username().send_keys(name)

    def input_password(self, pwd):
        """输入密码方法"""
        self.login_page.find_password().clear()
        self.login_page.find_password().send_keys(pwd)

    def click_login_btn(self):
        """点击登录按钮方法"""
        self.login_page.find_login_btn().click()


class LoginTask(object):
    """登录业务层"""
    def __init__(self):
        self.login_handle = LoginHandle()   # 获取操作层对象

    def login_method(self, name, pwd):
        self.login_handle.input_username(name)
        self.login_handle.input_password(pwd)
        self.login_handle.click_login_btn()

 

test_elife_login.py

"""
登录页面测用例
"""
import pytest

from AutoTestPom.Pages.login_page import LoginTask
from AutoTestPom.utils import DriverUtil, get_alert_msg


class TestLoginPage(object):
    """登录页面层"""

    def setup_class(self):
        """执行类之前运行一次"""
        self.driver = DriverUtil.get_driver()  # 获取浏览器对象
        self.login_task = LoginTask()          # 实例化登录页面业务层对象

    def teardown_class(self):
        """执行类之后运行一次"""
        DriverUtil.quit_driver()  # 退出浏览器对象

    def setUp(self):
        """执行每个测试用例前执行一次"""
        self.driver.get('http://127.0.0.1:8234')

    def tearDown(self):
        """执行完每个测试用例后执行一次"""
        pass

    def test_account_does_not_exist(self):
        """账号不存在测试方法"""
        self.login_task.login_method('by', 'sdfsdf')
        msg = get_alert_msg()
        print('错误信息为:', msg)

    def test_wrong_password(self):
        """密码错误测试方法"""
        self.login_task.login_method('byhy', 'error')
        msg = get_alert_msg()
        print('错误信息为:', msg)

 

utils.py

"""
公共方法模块
"""
import time

from selenium import webdriver
from time import sleep


def get_alert_msg():
    """获取弹窗信息方法"""
    time.sleep(2)
    driver1 = DriverUtil.get_driver()
    msg = driver1.switch_to.alert.text
    driver1.switch_to.alert.accept()
    return msg


class DriverUtil(object):
    """浏览器对象管理页"""
    # 对象变量只需要在类定义内部使用
    __driver = None

    @classmethod
    def get_driver(cls):
        """获取浏览器对象方法"""
        # 说明:为了防止在同一次测试过程中,调用获取浏览器对象方法时,都会创建
        # 一个新的浏览器对象,因此有必要先判断对象是否存在,不存在时再创建
        if cls.__driver is None:
            cls.__driver = webdriver.Chrome()
            cls.__driver.get('http://127.0.0.1:8234')
            cls.__driver.maximize_window()
            cls.__driver.implicitly_wait(10)
        return cls.__driver

    @classmethod
    def quit_driver(cls):
        """退出浏览器对象方法"""
        # 说明:必须保证浏览器对象存在,才能执行退出操作
        if cls.__driver:
            sleep(2)
            cls.__driver.quit()
            cls.__driver = None   # 保险手段:移除对象后,保留对象变量,以备下一次使用


if __name__ == '__main__':
    DriverUtil.get_driver()
    sleep(2)
    DriverUtil.quit_driver()