章节目录
前言
一、认识
二、优点
三、实现 Paget Object
1.Paget Object 简单实例
2.改进 Paget Object 封装
总结
Page Object模式下,应用程序中的每个网页都被表示为一个单独的类或对象。Page Object包含与该页面交互所需的所有方法和属性,例如查找元素、点击按钮、填写表单和检索数据等。
通过使用Page Objects,测试人员可以创建更有组织和可重用的代码,并减少重复代码的数量。Page Objects还使得更新测试更加容易,如果应用程序的UI发生变化,只需要在相应的Page Object类中进行更改即可。
1. 提高可读性
使用Page Objects,测试代码变得更加可读和易于理解。测试人员可以轻松地在Page Objects中编写可读的代码,而无需直接操作浏览器的底层API。这使得测试代码更易于维护和调试,同时也降低了测试代码的复杂度。
2. 提高可维护性
使用Page Objects,测试人员可以将UI元素和测试代码分开,从而提高代码的可维护性。如果UI元素发生了变化,测试人员只需要在相应的Page Object类中进行更改,而无需在测试代码中查找和更新所有与该元素相关的代码。这样可以大大减少代码的维护成本和时间。
3. 提高可扩展性
使用Page Objects,测试人员可以轻松地添加新的测试用例和新的页面。由于每个页面都有一个对应的Page Object类,因此只需创建一个新的Page Object类即可为新页面添加测试用例。这使得测试自动化框架更加灵活和可扩展。
4. 降低重复代码的数量
使用Page Objects,测试人员可以将通用的代码块抽象到Page Objects中,并在需要时重复使用。这可以减少测试代码的重复量,并提高代码的可重用性。此外,这还可以减少测试代码中的错误,并提高测试代码的质量。
...
def test_baidu_search_case1(self):
self.driver.get(self.base_url)
self.driver.find_element(By.ID, "kw").send_keys("selenium")
self.driver.find_element(By.ID, "su").click()
def test_baidu_search_case2(self):
self.driver.get(self.base_url)
self.driver.find_element(By.ID, "kw").send_keys("unittest")
self.driver.find_element(By.ID, "su").click()
def test_baidu_search_case3(self):
self.driver.get(self.base_url)
self.driver.find_element(By.ID, "kw").send_keys("page object")
self.driver.find_element(By.ID, "su").click()
...
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/4/3
"""
from selenium.webdriver.common.by import By
class BaiduPage():
def __init__(self, driver):
self.driver = driver
def search_input(self, search_key):
self.driver.find_element(By.ID, "kw").send_keys(search_key)
def search_button(self):
self.driver.find_element_by_id("su").click()
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/4/3
"""
import unittest
from selenium import webdriver
from baidu_page import BaiduPage
class TestBaidu(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.baidu_url = 'https://www.baidu.com'
def test_baidu_search_case1(self):
self.driver.get(self.baidu_url)
bd = BaiduPage(self.driver)
bd.search_input("selenium")
bd.search_button()
def test_baidu_search_case2(self):
self.driver.get(self.baidu_url)
bd = BaiduPage(self.driver)
bd.search_input("unittest")
bd.search_button()
def test_baidu_search_case3(self):
self.driver.get(self.baidu_url)
bd = BaiduPage(self.driver)
bd.search_input("page object")
bd.search_button()
def tearDown(self):
self.driver.close()
if __name__ == '__main__':
unittest.main
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/4/3
"""
from selenium.webdriver.common.by import By
class BasePage:
"""
基础 Page 层,封装一些常用方法
"""
def __init__(self, driver):
self.driver = driver
# 打开页面
def open(self, url=None):
if url is None:
self.driver.get(self.url)
else:
self.driver.get(url)
# id 定位
def by_id(self, id_):
return self.driver.find_element(By.ID, id_)
# name 定位
def by_name(self, name):
return self.driver.find_element(By.NAME, name)
# class 定位
def by_class(self, class_name):
return self.driver.find_element(By.CLASS_NAME, class_name)
# XPath 定位
def by_xpath(self, xpath):
return self.driver.find_element(By.XPATH, xpath)
# CSS 定位
def by_css(self, css):
return self.driver.find_element(By.CSS_SELECTOR, css)
# 获取 title
def get_title(self):
return self.driver.title
# 获取页面 text,仅使用 XPath 定位
def get_text(self, xpath):
return self.by_xpath(xpath).text
# 执行 JavaScript 脚本
def js(self, script):
self.driver.execute_script(script)
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/4/3
"""
from base import BasePage
class BaiduPage(BasePage):
"""百度 Page 层,百度页面封装操作到的元素"""
url = "https://www.baidu.com"
def search_input(self, search_key):
self.by_id("kw").send_keys(search_key)
def search_button(self):
self.by_id("su").click()
# _*_ coding:utf-8 _*_
"""
name:zhangxingzai
date:2023/4/3
"""
import unittest
from time import sleep
from selenium import webdriver
from baidu_page import BaiduPage
class TestBaidu(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Firefox()
def test_baidu_search_case(self):
page = BaiduPage(self.driver)
page.open()
page.search_input("selenium")
page.search_button()
sleep(2)
self.assertEqual(page.get_title(), "selenium_百度搜索")
@classmethod
def tearDownClass(cls):
cls.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
Page Object模式是一个非常有用的测试自动化设计模式,可以提高测试代码的可读性、可维护性和可扩展性,同时还可以降低测试代码的复杂度和重复量,提高测试代码的质量和效率。