为了降低web自动化测试的维护成本,降低代码冗余,提升测试用例的可读性,故衍生出了PageObject模式。
PO模式主要体现在对界面交互细节的封装,大体分为如下三层:
1、BasePage层:封装页面操作最基本的方法,如:打开/关闭浏览器,定位元素等,可被其他对象继承
2、Page层:提供对具体页面元素的定位、操作方法的封装
3、业务层:传入具体的参数,组织业务流程,执行自动化
下面用百度搜索页面进行实践:
目录结构:
base_page层代码:
from selenium import webdriver import time #定义所有页面都需要的基础类 class BasePage(): #初始化操作,获取浏览器驱动、地址 def __init__(self,driver,url): self.driver = driver self.url = url #打开浏览器,访问页面 def open(self): self.driver.get(self.url) self.driver.maximize_window() #定位页面元素 def locator_element(self,*locator): print(locator) el = self.driver.find_element(*locator) return el #退出浏览器 def quit(self): self.driver.quit()
Page层代码:
from selenium import webdriver from selenium.webdriver.common.by import By import time from Base.base_page import BasePage class SearchPage(BasePage): input_id = (By.ID,'kw') click_id = (By.ID,'su') #输入搜索内容 def input_text(self,text): self.locator_element(*self.input_id).send_keys(text) #点击搜索按钮 def click_element(self): self.locator_element(*self.click_id).click() #百度搜索业务流程 def search_text(self,text): self.open() self.input_text(text) self.click_element() class LoginPage(BasePage): accout_id = (By.ID,'userAccount') password_id = (By.ID,'password') login_xpath = (By.CLASS_NAME,'ant-btn') #输入用户名 def input_account(self,account): self.locator_element(*self.accout_id).send_keys(account) #输入密码 def input_password(self,pwd): self.locator_element(*self.password_id).send_keys(pwd) #点击登录 def click_login_ele(self): self.locator_element(*self.login_xpath).click() #登录流程 def login(self,account,pwd): self.open() self.input_account(account) self.input_password(pwd) self.click_login_ele() if __name__ == '__main__': driver = webdriver.Chrome() url = 'http://www.baidu.com' text = '大学' search_page = SearchPage(driver,url) search_page.search_text(text)
测试用例层:
import time import unittest from selenium import webdriver from ddt import data,ddt,unpack from PageObject.search import SearchPage,LoginPage @ddt class PageObjectUnit(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.implicitly_wait(10) def tearDown(self): time.sleep(5) self.driver.quit() @data(('http://www.baidu.com','大学')) @unpack def test_search_page(self,url,text): """测试百度搜索页""" search_page = SearchPage(self.driver,url) search_page.search_text(text) @data(('xxxxxxxx/login','xxxxxxx','123456')) @unpack def test_login_page(self,url,account,pwd): """测试登录页面""" login_page = LoginPage(self.driver,url) login_page.login(account,pwd) title = self.driver.title print(title) if __name__ == '__main__': unittest.main()