zoukankan      html  css  js  c++  java
  • Web 自动化测试(Selenium) PO 模型

    目录

      1. po 模型介绍

      2. PageObject 设计模式

      3. PO 的核心要素

      4. 非 PO 实现

        4.1 代码展示

        4.2 代码分析

      5. PO 实现

        5.1 实现BasePage

        5.2 实现 SearchPage

        5.3 实现 TestCase

      6. 总结

      7. PO 模式的优点

    1. po 模型介绍

      在自动化中,Selenium 自动化测试中有一个名字经常被提及 PageObject (思想与面向对象的特征相同),通常PO 模型可以大大提高测试用例的维护效率。

      优点:业务和对象分离,代码结构清晰,方便维护

    2. PageObject 设计模式

      

    3. PO 的核心要素

      1. 在 PO 模式中抽离封装集成一个 BasePage 类,该基类应该拥有一个只实现 webdriver 实例的属性

      2. 每一个page 都继承BasePage,通过 driver 来管理 page 中元素,将 page 中的操作封装成一个个方法

      3. TestCase 继承 unittest.TestCase类,并依赖page类,从而实现相应的测试步骤

    4. 非PO 实现

      4.1 代码展示

    from selenium import webdriver
    from time import sleep
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    driver.find_element_by_id("kw").send_keys("12306")
    sleep(1)
    driver.find_element_by_id("su").click()
    sleep(2)
    driver.quit()

      4.2 代码分析

        不同的运行脚本环境,浏览器不同,驱动 webdriver.Firefox() 可以剥离

        请求地址的变化(生产环境和测试环境):url = http://www.baidu.com可以剥离

        操作元素时,常常要等待元素加载完成方可进行操作:可以把webdriver提供的find_element*方法封装,在元素操作前,先判断元素是否可以操作

        实际测试场景中,可能有多个测试场景,如果每个测试场景都需要维护url,游览器驱动,元素定位等,效率会非常低

        因此基于以上分析,是否可以设计一个所有测试界面(selenium本身是B/S系统开展测试)的基类,来维护公共的方法,此处定义名字为BasePage.py,用于存放页面公共方法及webdriver原有方法二次封装等。

    5. PO 实现

      5.1 实现BasePage

    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains   #鼠标操作
    class BasePage():
        '''BasePage封装所有界面都公用的方法。例如driver,find_element等'''
        '''实例化BasePage类时,事先执行的__init__方法,该方法需要传递参数'''
        def __init__(self,driver,url):
            self.driver = driver
            self.base_url = url
        # 进入网址
        def get(self):
            self.driver.get(self.base_url)
        #元素定位,替代八大定位
        def get_element(self,*locator):
            return self.driver.find_element(*locator)
        #点击
        def left_click(self,*locator):
            ActionChains(self.driver).click(self.get_element(*locator)).perform()
        #输入
        def send_text(self,text,*locator):
            self.driver.find_element(*locator).send_keys(text)
        #清除
        def clear_text(self,*locator):
            self.driver.find_element(*locator).clear()

      5.2 实现 SearchPage

    '''
    实现步骤:(1)继承basepage,(2)元素传参,(3)调取方法
    '''
    from selenium.webdriver.common.by import By
    from pomodel.Base.base_page import BasePage
    class Search(BasePage):
        def __init__(self,driver,url):
            BasePage.__init__(self,driver,url)
         #进入百度
        def open_baidu(self):
            self.get()
        #输入搜索内容
        def input_search_content(self,text):
            self.send_text(text,By.ID,"kw")
        #点击按钮
        def click_baidu_search(self):
            self.left_click(By.ID,"su")

      5.3 实现 TestCase

    import unittest
    from selenium import webdriver
    from pomodel.Pages.search_pages import Search
    class BaiBu(unittest.TestCase):
        def setUp(self) -> None:
            self.driver = webdriver.Firefox()
            self.driver.implicitly_wait(10)
        def test_serach(self):
            url="http://www.baidu.com"
            s = Search(self.driver,url)
            s.open_baidu()
            s.input_search_content("jack")
            s.click_baidu_search()
        def tearDown(self) -> None:
            self.driver.quit()
    if __name__ == '__main__':
        unittest.main()

    6. 总结

      PO设计模式中的BasePage基类对应案例中的BasePage.py文件

      PO模式中的pages中的案例显示Search.py

      PO模式设计中TestCase对应案例中的TestCase.py

    7. PO 模式的特点

      1: PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰

      2:页面对象与用例分离,使得我们更好的复用对象

      3:可复用的页面方法代码会变得更加优化

      4:更加有效的命令方式使得我们更加清晰的知道方法所操作的UI元素

  • 相关阅读:
    python中enumerate用法
    python中实现列表元素的永久反转和临时反转
    python中利用循环结构求最大值、最小值、统计元素次数
    python中实现列表中指定元素保留唯一
    c语言中if嵌套
    python中判断列表是否为空
    c语言中避免else悬挂
    python中if条件分支
    ????
    面向对象编程:Java中的抽象数据类型
  • 原文地址:https://www.cnblogs.com/xinzaiyuan/p/14648342.html
Copyright © 2011-2022 走看看