UI自动化测试框架-POM模式
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()