在编写UI自动化脚本过程,需要考虑如何编写才能使脚本更容易维护及复用率更高,可读性更高。page object(以下称:PO模式)设计模式是Selenium 自动化测试项目开发实践的最佳设计模式之一,其核心思想就是将测试对象及测试脚本分层处理,对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案例的可读性。
PO模式中会先定义一个公共基类,里面封装底层操作接口,供其他上层使用。在PO模式中一个用例脚本可分为:元素和操作层(放置在一个模块中)、用例层(各操作组装放在一个模块中)、数据层(对应测试数据),下面以登录163邮箱为例进行说明。
目录结构如下:
page基类
from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.by import By class Page(): def __init__(self,driver): self.driver = driver def open(self,url): self.driver.get(url) self.driver.maximize_window() def find_element(self,*loc): try: wait = WebDriverWait(self.driver,timeout = 10) wait.until(lambda x:x.find_element(*loc).is_displayed()) return self.driver.find_element(*loc) except TimeoutException: raise "Time out" def find_elements(self,*loc): try: wait = WebDriverWait(self.driver,timeout = 10) wait.until(lambda x:x.find_elements(*loc).is_displayed()) return self.driver.find_elements(*loc) except TimeoutException: raise "Time out" def switch_iframe(self,*loc): name = self.driver.find_element(*loc) self.driver.switch_to_frame(name) def exit(self): self.driver.quit()
loginpage中放置元素和操作层
from selenium import webdriver from selenium.webdriver.common.by import By import time as t from basic.page import Page class LoginPage(Page): _iframe_loc = (By.XPATH,"//div[@id='normalLoginTab']/div[0]/div[0]/iframe") _user_loc = (By.XPATH,'//input[@name="email" and @data-loginname="loginEmail"]') _paw_loc = (By.XPATH,'//input[@name="password" and @placeholder="输入密码"]') _logbt_loc = (By.ID,"dologin") def user_input(self,username): self.switch_iframe(*self._iframe_loc) self.find_element(*self._user_loc).send_key(username) return username def paw_input(self,password): self.find_element(*self._paw_loc).send_key(password) def login_button(self): self.find_element(*self._logbt_loc).click()
test_login放置用例层
from elementpage.loginpage import LoginPage from selenium import webdriver from basic.page import Page import time class TestLogin(): def login(self,driver,url,username,password): """ :param driver: driver :param url: url :param username: 用户名 :param password: 密码 :return: """ obj = Page(driver) obj.open(url) #输入URL lobj = LoginPage(driver) lobj.user_input(username) #录入用户名 lobj.paw_input(password) #录入密码 lobj.login_button() #点击登录 obj.exit()
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:UI自动化之page object设计模式 - Python技术站