一、PO模式简单介绍
PO模式就是将将页面元素的定位与操作方法与各个页面上的元素分离,提高代码的复用率,降低代码的编写量。同时抽离业务逻辑,与数据文件,降低代码的耦合性。核心还是面向对象编程,通过子类继承父类的特性,达到使界面代码简洁的目的。
基本页面写常用的元素定位与元素操作,其他页面通过继承基本页面类,再添加该页面独特的元素定位与操作。感觉和MVC模式差不多,
二、PO模式超简单实例
(一)项目结构
BaseMethod:存放一些定义的通用方法,如读写excel,csv。本篇未用
Page:BasePage放基本的元素定位与操作方法,SearchPage
TestCase:存放测试用例
TestResult:测试结果存放目录,一般放截图,测试结果写入数据文件(CSV或excel),本篇未用。

image.png
(二)BasePage
基本页面类,定义所有的元素的定位与操作方法,浏览器操作,按键操作等,获取cookie等,不用一次写到位,用到什么了,就往里面加,慢慢就成为自己的库了。
注意:
_init_方法不要写错,是双下横线,init不要写错,_in根据IDE自动出来的名称是_int,这个不是初始化的构造方法,我踩过的坑,你们就不要踩了。
class Page(object):
"""
基类,PO模式的页面都继承这个类
"""
def __init__(self,driver,base_url):
#driver,base_url是在实例化的时候需要传入的参数
#注意__init__这个名称不要写错或者写漏,如果这里写漏了,什么都看不到
self.driver=driver
self.base_url=base_url
self.timeout=30
def GetPage(self):
self.driver.get(self.base_url)
def find_element(self,*locator):
return self.driver.find_element(locator)
def input_text(self,locator_method,element,value):
self.driver.find_element(locator_method,element).send_keys(value)
def click(self,locator_method,element):
return self.driver.find_element(locator_method,element).click()
def getTitle(self):
print(self.driver.title)
return self.driver.title
def driver_quit(self):
self.driver.quit()
(三)SearchPage
SearchPage通过继承BasePage类再次封装页面元素与操作方法,相当于将基本定位与操作方法与元素,输入文本等进行了隔离
from Page.BasePage import Page
from selenium.webdriver.common.by import By
class SearchPage(Page):
def searchBox_input(self,text):
return self.input_text(locator_method=By.ID,element='kw',value=text)
def search_btn_click(self):
self.click(locator_method=By.ID,element='su')
(四)TestCase.Case
import time
from selenium import webdriver
from Page.SearchPage import SearchPage
import unittest
class Test_search_page(unittest.TestCase):
def setUp(self) -> None:
self.driver=webdriver.Chrome()
self.base_url = 'https://www.baidu.com/'
def test_searchPage(self):
print(self.base_url)
search_page=SearchPage(self.driver,self.base_url) #实例化SearchPage页面类,传入初始化参数
search_page.GetPage()
search_page.searchBox_input(text='天天Python')
search_page.search_btn_click()
search_page.getTitle()
def tearDown(self) -> None:
time.sleep(5)
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
