• 多测师肖sir_高级金牌讲师_ui自动化po框架版本02


    ui自动化po框架版本02
    一、

    pages下的BasePage.py模块

    
    '''
    此模块是封装所有用例的基类
    比如说:所有用例要用到的元素定位,以及输入框输入,点击,下拉等等公共方法
    '''
    import unittest  #导入unittest 框架
    from time import *
    
    # 调试代码
    from selenium import webdriver
    #driver = webdriver.Chrome()
    
    class BasePage(unittest.TestCase):  #创建一个BasePage类,这个类继承unittest框架中TestCase这个类
        @classmethod   #我们在Ui 自动化我们就是打开浏览器,,我们之前是把所有的浏览器都是同一个,我们创建类方法,
        def set_driver(cls,driver):  #入参是一个driver对象,把创建好的driver对象传进来,变成BasePage这个类的属性
            #把传进来的谷歌浏览器对象作为当前类、基类属性,基类的变量
            cls.driver = driver   #保证每一个用例用的是同一个driver
        @classmethod
        def get_driver(cls):   #单例设计模式   #创建好以后basepage来拿通过get_driver来都是同一个对象
            return cls.driver :
    
        #baidu_input=("id","kw")
        @classmethod
       #优点,把重复的代码都省了
        def find_element(cls,element): #定位元素的时候用到很多种方法
            type = element[0]   #id
            value = element[1]  #kw
            if type == "id":
                elem = cls.driver.find_element_by_id(value)
            elif type == "xpath":
                elem = cls.driver.find_element_by_xpath(value)
            elif type == "class":
                elem = cls.driver.find_element_by_class_name(value)
            elif type == "name":
                elem = cls.driver.find_element_by_name(value)
            elif type == "css":
                elem = cls.driver.find_element_by_css_selector(value)
            elif type == "link_text":
                elem = cls.driver.find_element_by_link_text(value)
            elif type == "partial":
                elem = cls.driver.find_element_by_partial_link_text(value)
            else:
                raise ValueError("plese input corrt paramters")
            return elem
    
        @classmethod   #封装输入函数
        def sendKeys(cls,elem,text):
            return elem.send_keys(text)
    
        @classmethod   #封装点击操作
        def click(cls,elem):
            return elem.click()
    
        @classmethod
        def wait(cls,sec):
            '''封装一个隐式等待'''
            return driver.implicitly_wait(sec)
    
        @classmethod
        def sleep(cls,sec):
            return sleep(sec)
    
        @classmethod
        def frame(cls,elem):
            '''定位iframe框'''
            return cls.driver.switch_to.frame(elem)
    
        @classmethod
        def outframe(cls):
            return cls.driver.switch_to.default_content()
    
        @classmethod
        def get_text(cls,element):
            '''封装根据网页元素拿到text值'''
            value = BasePage.find_element(element).text
            return value
    
    if __name__ == '__main__':
        from selenium import webdriver  
        driver = webdriver.Chrome()
        driver.get("http://www.baidu.com")
        driver.maximize_window()
        baidu_input = ("id","kw")
        elem = BasePage.find_element(baidu_input).send_keys("多测师")
        # elem = BasePage.find_element(baidu_input)  #调用elem的返回值就得得到elem值
        # BasePage.sendKeys(elem,"多测师")
    注意:1、点通过解释调试
    2、调用的时候用类的方法
    
    注解:
    unittest.TestCase的子类BasePage增加两个类方法:set_driver和get_driver
    set_driver(cls, driver) 方法是用来设置driver属性的。这个方法接收一个driver参数,这个参数通常是一个webdriver对象(例如来自selenium库),然后把这个对象赋值给BasePage类的一个属性(也就是cls.driver)。这个方法通常在测试类的setup方法中被调用,以便在执行测试用例前准备好webdriver。
    get_driver(cls) 方法是用来获取driver属性的。这个方法返回BasePage类的一个属性(也就是cls.driver)。这个方法通常在测试类的teardown方法中被调用,以便在执行测试用例后清理webdriver。
    然而,这段代码中存在一个问题。set_driver和get_driver方法都是类方法,它们都需要一个cls参数。但是,在set_driver方法中,你并没有使用这个cls参数。如果你想在set_driver中使用cls参数,你可以像下面这样修改代码:
    
    
    =================================
    下面我们写两条用例:登陆,用户中心
    
    我们先写登陆:
    
    ```python
    rom public.pages.BasePage import BasePage  #导入BasePage ,基类,导入后我们在类中继承
    from selenium import webdriver
    from public.utiles.read_ini import read  #导入read对象
    import unittest
    from public.pages.Pages_Element impor Pages_Element as p
    
    
    url = read.read_data_ini("test_data","url")
    username = read.read_data_ini("test_data","username")
    pwd = read.read_data_ini("test_data","pwd")
    
    class Test_login(BasePage): #定义一个登陆的类,我们要继承basepage 要导包,因为BasePage引入了unttest类 也就是爷爷类
        @classmethod
        def setUpClass(cls) -> None:  #类的开始
            driver = webdriver.Chrome()   #创建一个唯一的driver,只能打开一次,我们保证后面的都引用同一个对象,类是可以传递的,
            BasePage.set_driver(driver) #我们继承的 BasePage,dirver当一个变量来传递,后面通过调用ge——driver
        @classmethod
        def tearDownClass(cls) -> None:
            '''每次跑完用例等待3秒'''
            BasePage.sleep(3)
        def test_01_login(self):
            #1.拿到driver对象
            driver = BasePage.get_driver()
            driver.get(url)
            driver.maximize_window()
            driver.implicitly_wait(20)
            #2.输入用户名
            elem =BasePage.find_element(p.userName)
            BasePage.sendKeys(elem,username)
            #3.输入密码
            elem = BasePage.find_element(p.passWord)
            BasePage.sendKeys(elem,pwd)
            #4.点击登陆
            elem = BasePage.find_element(p.loginBtn)
            BasePage.click(elem)
            #5.断言
            value =BasePage.get_text(p.desktop)
            assert value=="我的桌面"
    
    
    if __name__ == '__main__':
        unittest.main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144

    注意:cls类方法, self 实例方法

    
    
    • 1
  • 相关阅读:
    Ubuntu安装c/c++编译环境
    二叉搜索树的众数(力扣501)
    【Gazebo入门教程】第一讲 Gazebo的安装、UI界面、SDF文件介绍
    NVMe协议详解(一)
    每秒生成10万订单号
    vue中使用window.open打开assets文件夹下的pdf文件
    【数据结构】搜索树&Map&Set
    2023联考管综论说文阅卷标准及提分计划:附2010-2022年真题
    浙江大学2024年研招简章总纲领公布:MBAMPAMEM报考划重点版
    IPEmotion的NVH噪声测试模块——坎贝尔图
  • 原文地址:https://blog.csdn.net/m0_47403059/article/details/134330853