UI 自动化测试脚本的编写不是多么艰巨的任务。只需要定位到元素,执行对应元素的操作即可,我们所能做的就是元素的定位,然后进行键盘输入或鼠标动作。就这个小程序而已,维护起来看起来是很容易的。但随着时间的迁移,测试套件将持续的增长。脚本也将变的越来越多。如果我
们需要维护 10 个页面,100个页面,甚至 1000 个呢?那么页面元素的任何改变都会让我们的脚本维护变得繁琐复杂,而且变得耗时易出错。那怎么解决呢? UI 自动化中,常用的一种方式,引入 Page Object(PO):页面对象模式来解决,po 能让我们的测试代码变得可读性更好,可维护性高,复用性高。
一、模型思想
(1)Page Objects 模型(PO 模型)理解
页面对象模型(PO)是一种设计模式。在 PO 下,应用程序的每一个页面都有一个对应的 page class每一个 page class 维护着该 web 页的元素集和操作这些元素的方法page class 中的方法命名最好根据对应的业务场景进行,例如通常登录后我们需要等待几秒钟我们可以这样命名该方法:waitingForLoginSuccess()。
(2)PO 的代码目录组织示例
(3)PO 模型优势
PO 提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变
得更加清晰。页面对象与用例分离,使得我们更好的复用对象。更加有效的命名方式使得我们更加清晰的知道方法所操作的UI 元素。例如我们要回到首页,方法命名为:getoHomePage(),通过方法名即可清晰的知道具体的功能实现。
二、PO 模型分层设计示例
(1)分层设计
Page 页面层:负责对某个页面元素定位和操作,各类操作可以写成函数
Case 用例层:验证实际结果和预期结果是否一致
(2)基础页面
# Page 类
class Page:
# 初始化方法
def__init__(self, driver,base_url="http://wwww.baidu.com"):
self.driver = driver
self.base_url = base_url
self.timeout = 30
# 定位元素的方法
def find_element(self, *loc):
return self.driver.find_element(*loc)
# 输入数据的方法
def input(self, loc, text):
self.find_element(*loc).send_keys(text)
# 点击元素的方法
def click(self, loc):
self.driver.find_element(*loc).click()
# 获取页面标题的方法
def get_title(self):
return self.driver.title
(3)搜索页面
from selenium.webdriver.common.by import By
from PODemo.pages.basePage import Page
# 搜索页面类
class SearchPage(Page):
search_input = (By.ID, "kw")
search_button = (By.ID, "su")
# 初始化方法
def__init__(self, driver,base_url="http://www.baidu.com"):
Page.__init__(self, driver, base_url)
# 获取百度首页的方法
def getBaiduHomePage(self):
print("打开首页", self.base_url)
self.driver.get(self.base_url)
# 输入搜索内容
def input_search_text(self, text="PO模型"):
print("输入搜索关键字:PO模型")
self.input_text(self.search_input, text)
# 点击搜索按钮
def click_search_button(self):
print("单击百度一下按钮")
self.click(self.search_button)
(4)测试搜索页面
import unittest
from selenium import webdriver
from time import sleep
from PODemo.pages.searchPage import SearchPage
# 测试类
class TestSearchCase(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Chrome()
def test_search(self):
driver = self.driver
url = "http://www.baidu.com"
# 搜索关键词
text = "PO模型"
# 期望结果
assert_title = "PO模型_百度搜索"
# 实例化搜索页面类SearchPage
search_page = SearchPage(driver, url)
# 打开百度
search_page.getBaiduHomePage()
# 输入搜索关键词
search_page.input_search_text(text)
# 点击搜索
search_page.click_search_button()
sleep(3)
# 断言是否成功
self.assertEqual(search_page.get_title(), assert_title)
def tearDown(self) -> None:
sleep(3)
self.driver.quit()