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

虽然之前的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+pytest)