page Object使用
使用 page object 模式的好处:
- 创建可跨多个测试用例共享的可重用代码
- 减少重复代码的数量
- 如果用户界面发生变化,修复只需要在一个地方进行更改
官网示例代码
PythonOrgSearch调用MainPage(main_page = page.MainPage(self.driver))将driver传到class BasePage(object)并初始化。
接着判断python.org是否被正常加载(assert main_page.is_title_matches(), "python.org title doesn't match.")
接着调用(main_page.search_text_element = "pycon")传入搜索关键字‘pycon’。并调用(class SearchTextElement(BasePageElement):)传入搜索的id,进行搜索
点击搜搜按钮,断言搜索结果是否为:No results found.
PythonOrgSearch.py
import unittest from selenium import webdriver import page class PythonOrgSearch(unittest.TestCase): """A sample test class to show how page object works""" def setUp(self): self.driver = webdriver.Chrome() self.driver.get("http://www.python.org") def test_search_in_python_org(self): """ 测试python.org的搜索功能,搜索关键字“pycon”,然后验证结果是否显示。 请注意,它不会在搜索结果页中查找任何特定文本。此测试验证结果不是空的。 """ #加载主页面 main_page = page.MainPage(self.driver) #检查"Python"是否在title中 assert main_page.is_title_matches(), "python.org title doesn't match." #设置搜索的文本"pycon" main_page.search_text_element = "pycon" main_page.click_go_button() search_results_page = page.SearchResultsPage(self.driver) #验证结果不为空 assert search_results_page.is_results_found(), "No results found." def tearDown(self): self.driver.close() if __name__ == "__main__": unittest.main(verbosity=2)
page.py
from element import BasePageElement from locators import MainPageLocators class SearchTextElement(BasePageElement): """这个类是为了获得来自特定定位器的文本""" #这个是搜索框的定位器 locator = 'q' class BasePage(object): """Base class to initialize the base page that will be called from all pages""" def __init__(self, driver): self.driver = driver class MainPage(BasePage): """Home page action methods come here. I.e. Python.org""" #声明一个变量,将包含检测到的文本 search_text_element = SearchTextElement() def is_title_matches(self): """验证Python是否在页面标题中显示""" return "Python" in self.driver.title def click_go_button(self): """点击搜索按钮""" element = self.driver.find_element(*MainPageLocators.GO_BUTTON) element.click() class SearchResultsPage(BasePage): """搜索结果页面""" def is_results_found(self): # 也许会在特定的页面展示元素不存在‘No results found.’ return "No results found." not in self.driver.page_source
element.py
from selenium.webdriver.support.ui import WebDriverWait class BasePageElement(object): """Base page class 是为了初始化每个页面的对象class.""" def __set__(self, obj, value): """将文本设置为提供的值 'pycon' 并且,self.locator='q' 由调用者传递""" driver = obj.driver WebDriverWait(driver, 100).until( lambda driver: driver.find_element_by_name(self.locator)) driver.find_element_by_name(self.locator).clear() driver.find_element_by_name(self.locator).send_keys(value) def __get__(self, obj, owner): """获取指定对象的值""" # self.locator=‘q’ driver = obj.driver WebDriverWait(driver, 100).until( lambda driver: driver.find_element_by_name(self.locator)) element = driver.find_element_by_name(self.locator) return element.get_attribute("value")
locator.py
from selenium.webdriver.common.by import By class MainPageLocators(object): """A class for main page locators. All main page locators should come here""" GO_BUTTON = (By.ID, 'submit') class SearchResultsPageLocators(object): """A class for search results locators. All search results locators should come here""" pass
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~