博客
关于我
Python Selenium设计模式 —— POM
阅读量:798 次
发布时间:2023-03-06

本文共 3089 字,大约阅读时间需要 10 分钟。

Selenium自动化测试实践:Page Object Model(POM)设计模式

随着自动化测试项目的不断发展,传统的Selenium脚本逐渐暴露出维护困难、代码复杂度高等问题。为了应对这些挑战,Page Object Model(POM)作为一种设计模式应运而生,为我们提供了一种更高效、可维护的解决方案。本文将从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的核心概念

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的优势

  • 清晰的分离:将元素库与用例分离,提升代码复用性和可维护性。
  • 高效管理:通过抽象页面对象,简化元素定位和操作,减少维护成本。
  • 易于扩展:支持多页面应用,提升项目的灵活性和可维护性。
  • 优化命名:方法名清晰反映功能,方便理解和维护。
  • POM实现示例

    百度搜索示例

    以下是百度搜索功能的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/

    你可能感兴趣的文章
    Python yield generator
    查看>>
    Python yield 使用浅析
    查看>>
    Python yield解析:深入理解生成器的魔力
    查看>>
    Python You are using pip version 10.0.1, however version 19.3.1 is available.
    查看>>
    python zipfile模块学习笔记(一)
    查看>>
    Python zip函数 详解(全)
    查看>>
    Python \r\n与\n的转换
    查看>>
    python __new__中单例的作用
    查看>>
    python | aiofiles,一个超酷的 Python 库!
    查看>>
    python | akshare,一个超强的 开源Python 金融数据接口库!
    查看>>
    python | alabaster,一个强大的 关于alabaster 主题 Python 库!
    查看>>
    python | algorithms,一个超赞的 集合常用算法的Python 库!
    查看>>
    python调用jpype 报错:OSError JVM is already started和JVM cannot be restarted
    查看>>
    python | authlib,一个强大的 Python 库!
    查看>>
    python | awswrangler,一个高效的 Python 库!
    查看>>
    python | bashplotlib,一个有趣的Python库!
    查看>>
    python | bentoml,一个超级厉害的 模型部署 Python 库!
    查看>>
    python调用jar包的模块_python调用jar包
    查看>>
    python | black,一个神奇的 代码格式化工具 Python 库!
    查看>>
    python | bleach,一个超强的 Python 库!
    查看>>