本文共 3089 字,大约阅读时间需要 10 分钟。
随着自动化测试项目的不断发展,传统的Selenium脚本逐渐暴露出维护困难、代码复杂度高等问题。为了应对这些挑战,Page Object Model(POM)作为一种设计模式应运而生,为我们提供了一种更高效、可维护的解决方案。本文将从POM的基本概念、优势以及实际应用示例入手,帮助读者深入理解POM的价值。
在Selenium的基础上,从简单的UI级自动化测试开始,确实只需定位元素并执行操作即可。例如,以下代码实现了百度搜索功能:
from selenium import webdriverdriver = webdriver.Firefox()driver.implicitly_wait(30)driver.get("http://www.baidu.com")driver.find_element_by_id("kw").send_keys("selenium")driver.find_element_by_id("su").click()time.sleep(5)driver.quit() 然而,随着项目复杂度的增加,单一页面的脚本逐渐演变为多个页面的复合,页面元素的任何变更都可能导致维护工作变得繁琐且易出错。这种情况下,POM的优势逐渐显现。
POM通过创建页面对象模型,将应用程序的每个页面抽象为一个类。每个page class包含该页面的所有元素集合及其操作方法。例如,登录页面通常定义了用户名和密码字段以及相关的操作方法,如waiting_for_login(),用于处理登录后的等待逻辑。
以下是典型的POM代码结构:
pages/├── basePage.py├── searchPage.py├── testPage.py└── testSearchPage.py
basePage.py:定义了通用页面类,包含基本操作方法。searchPage.py:定义了百度搜索页面的元素集合及其操作方法。testPage.py:定义了单独测试页面的元素和逻辑。testSearchPage.py:包含测试用例,使用上述页面类进行测试。以下是百度搜索功能的POM实现:
# basePage.pyclass Page(object): def __init__(self, driver, base_url): self.driver = driver self.base_url = base_url self.timeout = 30 def find_element(self, *loc): return self.driver.find_element(*loc) def input_text(self, loc, text): self.find_element(*loc).send_keys(text) def click(self, loc): self.find_element(*loc).click() def get_title(self): return self.driver.title
# searchPage.pyfrom pages.basePage import Pageclass SearchPage(Page): # 元素集合 search_input = (By.ID, 'kw') search_button = (By.ID, 'su') def goto_baidu HomePage(self): self.driver.get(self.base_url) def input_search(self, text): self.input_text(self.search_input, text) def click_search(self): self.click(self.search_button)
以下是测试用例的实现:
# testSearchPage.pyfrom selenium.webdriver.common.by import Byfrom pages.searchPage import SearchPageimport unittestclass TestSearchPage(unittest.TestCase): def setUp(self): self.driver = webdriver.Ie() def testSearch(self): url = 'http://www.baidu.com' text = '开源优测' assert_title = '开源优测_百度搜索' search_page = SearchPage(self.driver, url) search_page.goto_baiduHomePage() search_page.input_search(text) search_page.click_search() self.assertEqual(search_page.get_title(), assert_title) def tearDown(self): self.driver.quit()
将代码组织在main.py中执行测试并生成报告:
import unittestfrom HTMLTestRunner import HTMLTestRunnerfrom testcase.testSearchPage import TestSearchPagedef main(): suite = unittest.TestSuite() suite.addTest(TestSearchPage('testSearch')) fp = open('result.html', 'wb') runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='百度搜索测试', description='测试报告') runner.run(suite) fp.close()if __name__ == '__main__': main() POM通过将元素、操作和业务逻辑分离,为Selenium自动化测试提供了一种更高效、可维护的解决方案。通过构建页面对象模型,测试代码变得更加清晰,维护成本降低,适合复杂项目的长期发展。希望本文能够帮助读者理解POM的价值,并在实际项目中得到有效应用。
转载地址:http://bhafk.baihongyu.com/