第二个框架:一个简单的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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容