美文网首页收藏自动化
第二个框架:一个简单的UI自动化框架-selenium+pyte

第二个框架:一个简单的UI自动化框架-selenium+pyte

作者: Rainbow想喝奶茶 | 来源:发表于2021-11-30 11:53 被阅读0次

    虽然之前的api自动化测试框架还有很多可完善的地方,但是由于基本满足了我目前的使用场景,于是这两天我又在ui自动化测试框架上进行了一番简单的临摹学习,实现了一个基础架构,接下来一小段时间会努力在丰富一下的。然后会和之前的api测试部分整合起来。

    Page Object Model

    这个ui自动化测试框架,应用到的一种模式叫做PO模式,Page Object Model(页面对象模型)。这个模式主要是说将每一个页面看做是一个对象,具体页面操作与测试流程相分离,单独一个方面的更改并不会影响到对方。

    主要应用

    • 利用selenium进行元素定位及操作
    • 利用pytest进行测试验证。
    • 其它辅助工具帮助更好的执行自动化,例如测试数据的读写、日志记录、html记录以及截屏图像等。

    框架结构

    整体框架主要分为四个部分:

    • Page Model:包括封装selenium操作,及各个页面元素定位。
    • TestCase:主要有测试用例文件、测试请求数据以及测试结果存储数据。
    • Utils:包含框架用到的工具,例如读写excel、截屏、日志、发送邮件、html报告存储等。
    • Config:一些配置,例如url、环境配置等。


      框架结构

    PageModel

    PageModel主要包括page软件包以及base_page.py文件。

    页面元素定位及操作设置

    建立page
    软件包,内部存储各个页面的元素定位信息,以及需要执行的自动化操作。
    首先是入口页需执行测试的对象。

    #unique_page.py
    
    from selenium.webdriver.common.by import By
    
    elements = [
        {'name': 'choose1', 'desc': '选择一', 'by': (By.XPATH, '/html/body/div[1]/'),
         'action': 'click()'},
        {'name': 'choose2', 'desc': '选择二', 'by': (By.XPATH, '/html/body/div[2]'),
         'action': 'click()'},
        {'name': 'create_btn', 'desc': '点击生成', 'by': (By.XPATH, '/html/body/div[3]/'),
         'action': 'click()'}
    ]
    

    以及结果页需要执行测试的对象。

    #result.py
    
    from selenium.webdriver.common.by import By
    
    elements = [
        {'name': 'description', 'desc': '描述', 'by': (By.XPATH, '/html/body/div[4]/'),
         'action': 'text'},
    ]
    

    元素操作封装

    在base_page.py文件中,进行各项元素定位及操作的获取,并封装执行的操作。

    获取元素

    通过import_module方法,以字符串为参数,动态引用页面元素的位置及操作。即上方unique_page.py/result.py文件中的elements。

    #base_page.py
    import importlib
    # 通过传入字符串来引用一个模块
    def get_page_elements(page):
        m = importlib.import_module(page)
        element = m.elements
        return element
    
    
    封装页面操作

    通过上方的get_page_elements方法获取到元素后,先在Page类中定义一些初始化变量。

    #base_page.py
    class Page(object):
        def __init__(self, driver, page):
            self.driver = driver
            self.page = page
            self.elements = get_page_elements(page)
            self.by = ()
    

    Page类中建立get_each_elem方法,获取元素的具体定位。

        def get_each_elem(self, elem):
            for each in self.elements:
                if each['name'] == elem:
                    self.by = each['by']
    

    Page类中建立selenium_elem方法,封装浏览器查找元素位置。这里的find_element方法括号内的参数,必须加*号变为位置参数,否则执行时会报错:Message: invalid argument: 'using' must be a string。(我至今还没有明白为什么...)

        def selenium_elem(self, args=None):
            element = self.driver.find_element(*self.by)
            return element
    

    Page类中建立operate_elem方法,封装元素点击操作。相似的各种操作都可以在这之后建立,例如获取文案(.text)等等。

    #执行元素点击操作
        def operate_elem(self, elem, args=None):
            self.get_each_elem(elem)
            element = self.selenium_elem()
            return self.driver.execute_script("arguments[0].click();", element)
    #执行获取文案操作
        def get_elem(self, elem, args=None):
            self.get_each_elem(elem)
            element = self.selenium_elem().text
            return element
    

    TestCase

    测试用例软件包中,主要包括Case(各个页面的测试用例)、data(测试数据)以及result_data(需要保存的结果数据)。
    测试用例中,直接调用PageModel中标明的页面元素以及操作方法。

    #test_unique.py
    from selenium import webdriver
    from  PageModel.base_page import Page
    def test_one():
        driver = webdriver.Chrome()
        driver.get('https://***.com')
        driver.switch_to.frame(0)#所测页面在一个frame中,需要先转入。
    #进入入口页操作元素
        obj = Page(driver, 'PageModel.page.unique_page')#第二个参数是字符串,动态引入页面元素定位
        obj.operate_elem('choose1')#对元素执行点击操作
        obj.operate_elem('choose2')#对元素执行点击操作
        obj.operate_elem('create_btn')#对元素执行点击操作
    #进入结果页操作元素
        result = Page(driver, 'PageModel.page.result')
        desc = result.get_elem('description')
        assert desc == 'Success'
    

    终端运行pytest test_unique.py即可。

    Utils

    如果需要操作数据,比如从数据库表读取参数,或者将结果写入数据库表。可以增加excel的读写方法。
    读取数据

    #read_excel.py
    import pandas as pd
    
    def read_excel(file):
        read_data = pd.read_excel(file)
        data = []
        for i in read_data.index.values:
            row_data = read_data.loc[i, :].to_dict()
            data.append(row_data)
        return data
    

    写入数据

    #write_excel.py
    import pandas as pd
    
    def write_excel(data, file):
        df = pd.DataFrame(data)
        df.to_excel(file, index=False)
    

    至此,一个简单的UI自动化测试框架搭建完成,现阶段,实现的只有结构图标记已完成的部分,还需要不断的去填充和学习。目前的目录如下~


    当前框架目录

    未来一小段日子会继续丰富的~~~

    历时了三天,终于写完了~


    这两天补充了两个模块,截图打印日志,直接上对应的记录链接,所以现在的目录如下~

    当前框架目录-211208

    自我记录,有错误欢迎指正~

    相关文章

      网友评论

        本文标题:第二个框架:一个简单的UI自动化框架-selenium+pyte

        本文链接:https://www.haomeiwen.com/subject/enyxxrtx.html