python+selenium+unittest+ddt自动化框架详解

【unittest】

什么是框架?

框架其实定制研发的应用骨架,它对基础的代码进行了封装并且提供API接口。其他开发只要直接调用封装好的API接口即可,从而提高工作效率。

unittest自动化框架介绍

自动化测试为了对一个系统做自动化而封装的一个代码主骨架,其他自动化测试工程师只要去调用这个骨架里面的方法就可以实现自动化测试,这个主骨架就是自动化框架。unittest是Python语言自带的单元测试框架,做功能自动化和接口测试时也都可以使用这样的框架来管理代码
1、自动化的作用
(1)提高测试效率,降低维护成本
(2)减少人工干预脚本因素
(3)增加代码的可重用率
2、unittest单元测试框架和自动化测试框架的关系
单元测试:我们针对程序的最小单元(方法)进行测试
自动化框架的重要组成部分:
unittest
pom
ddt数据驱动
全局配置文件封装
selenium二次封装
日志监控
断言
报告及邮件发送
3、unittest框架主要做了什么?
(1)测试发现:从多个.py文件中收集并且加载测试用例
(2)测试执行:将测试用例按照一定的顺序和条件去执行并且生成结果
(3)测试判断:通过断言去判断结果是否正确
(4)测试报告:统计测试进度、通过率、生成报告
4、unittest重要组件
(1)TestCase:是测试的最小单元模块。
(2)TestSuite:是测试集,它被用于把测试整合在一起,批量运行测试。
(3)TestFixture:表示执行一个或者多个测试前的准备工作,确保每个测试之间的独立性。其中 setUp() 和 tearDown() 是最常用的方法
(4)TestLoader:是用来加载 TestCase到TestSuite中
(5)TestRunner:是运行测试器, 测试运行器是协调测试执行并向用户提供结果的组件
5、用例编写规则
unittest:提供了testcase测试用例,testsuites测试套件、testfixtrue测试固件或者夹具,testloader测试加载器,testrunner测试运行器。必须遵守以下原则:
(1)测试文件必须先导入import uinttest
(2)测试类必须继承unittest.TestCase
(3)测试方法必须以test开头
6、TestCase用法

import unittest
import requests
import os,sys
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0,parentdir)
from db_fixture import test_data

class login_test(unittest.TestCase):##创建login_test测试类,继承unittest.TestCase类:创建测试用例,调用添加发布会接口,验证并返回数据
    ##登录
    def setUp(self):
        self.base_url = "http://127.0.0.1:8000/login_action/"
    def tearDown(self):
        print()

    def test_login_success(self):#添加成功
        payload = {'username':'admin','password':'admin123456'}
        r =requests.post(self.base_url,data=payload)
        print(r.status_code)
        self.assertEqual(r.status_code, 200)

运行方式:
(1)使用unittest命令行的命令行方式运行
python -m unittest -v login_test.login_test
python -m 以脚本的方式运行一个模块
unittest -v 更详细的输出结果
login_test.login_test 模块名.类名.方法名
-k匹配模式:
1.通配符 -k *test_login_success
2、字符串 -l login_success
(2)使用unittest.main
直接在pycharm中运行

unittest 的单元测试库提供了标准的断言方法

assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b 2.7
assertIsNot(a, b) a is not b 2.7
assertIsNone(x) x is None 2.7
assertIsNotNone(x) x is not None 2.7
assertIn(a, b) a in b 2.7
assertNotIn(a, b) a not in b 2.7
assertIsInstance(a, b) isinstance(a, b) 2.7
assertNotIsInstance(a, b) not isinstance(a, b) 2.7

【selenium的工作原理】

脚本启动driver,启动浏览器作为远程服务器,执行脚本发送请求,服务器解析请求做出相应的操作,反馈给客户端(脚本)。我们做的web ui的自动化测试,大部分都是在使用webdriver提供的API来模拟手动测试过程中的一系列动作和行为。

什么是po模型

page object的统称,是一种设计思想,把一个页面当作一个对象,页面的元素与元素之间操作方法就是页面对象的属性与行为,一般一个页面写一个类文件,这个类文件包含该页面的元素定位和业务操作方法。
po模式一般分为三层。基础封装层BasePage、PO页面对象层、TestCase测试用例层

selenium常用的定位方式

id 、classname、tagname、linktext、patrillinktext、xpath、css_selector。常用id、classname、xpath、css_selector

遇到frame框架页面处理

先用driver.switch_to.frame(可自行分装id/xpath)
操作页面元素
driver.switch_to.default_content()

下拉菜单处理方式

1.如果是select
selenium中的select类
a、定位元素
b、将元素转化成select对象
c、通过下标或者文本选择
sel.select_by_index(index)
sel.select_by_value(value)
sel.select_by_visible_text(text)
2.非select
找到元素,采用2次点击方式定位

上传图片的几种方式

1.sendkeys
input属性,且type="file",直接使用sendkeys
非input属性:借助python中的win32 api、win32 con模拟按键输入
2.AutoIt工具
3.模拟按键

自动化的三种等待方式

1.time.sleep(1),一般建议少用
2.implicitly_wait():等待直到元素加载完成
4.explicit_wait():显性等待
3.WebDriverWait:显示等待,自定义函数代码,等待某个函数加载完成

ddt数据驱动

通过数据驱动改变数据,即对测试数据进行参数化,来驱动测试的执行,实现了数据和代码的分离,是unittest中实现数据驱动的主要方式之一。
ddt.ddt:
装饰类,也就是继承自 TestCase 的类,标记测试类,支持DDT数据驱动。
ddt.data:
装饰测试方法。参数是一系列的值。标记测试用例,传递参数
ddt.file_data:
装饰测试方法。标记测试用例,传递文件。文件可以是json 或者 yaml类型
ddt.unpack:
传递的是复杂的数据结构时使用。比如使用元组或者列表,添加 unpack 之后,ddt 会自动把元组或者列表对应到多个参数上。

传入序列时,必须使用
拆包,否则会将会整个数据作为一个整体传入
unpack与*区别
*是对传入的序列进行拆包,拆包后将元素依次传给测试用例,表示用例执行次数
@unpack是对每次传入用例的参数进行拆包,拆包后将元素依次传给用例的每个参数,表示执行每次用例时的参数

image.png

【问题】:

1.在你做自动化过程中,遇到了什么问题吗?
有遇到问题和挑战,主要有以下几点:
频繁地变更UI,经常要修改页面对象里面代码
运行用例报错和处理,例如元素不可见,元素找不到这样异常
测试脚本复用,尽可能多代码复用
一些新框架产生的页面元素定位问题

2.举例一下你遇到过那些异常,在selenium自动化测试过程中
写脚本过程最常见的异常就是,这个元素无法找到。
常见的selenium有以下这些:

  1. ElementNotSelectableException :元素不能选择异常

  2. ElementNotVisibleException :元素不可见异常

  3. NoSuchAttributeException :没有这样属性异常

  4. NoSuchElementException:没有该元素异常

  5. NoSuchFrameException :没有该frame异常

  6. TimeoutException : 超时异常

  7. Element not visible at this point :在当前点元素不可见

  8. 如何处理alert弹窗

我们常见的alert弹窗有两种:基于windows弹窗和基于web页面弹窗
我们知道,webdriver是能够处理alert弹窗的,Selenium提供了Alert这个接口。相关操作代码如下:
// 切换到Alert
Alert alert = driver.switchTo().alert();
// 点击弹窗上确定按钮
alert.accept();
// 点击弹窗的取消按钮
alert.dismiss()
// 获取弹窗上线上的文本文字内容
alert.getText();
// 有些弹窗还支持文本输入,这个可以把要输入字符通过sendkeys方法输入
alert.sendkeys();

  1. 在selenium中如何处理多窗口?
    swithTo方法

  2. 如何处理下拉菜单?
    通常我们也可以通过Click方法来点击下拉菜单里面的元素,还有一种方法,在Selenium中有一个类叫Select,支持这种下拉菜单交互的操作。
    基本使用语法是这样的:
    Select Se=new Select(element);
    Se.selectByIndex(index);
    Se.selectByvalue(value);
    Se.selectByVisibleText(text);

6.日历处理
1.通过元素定位实现2次点击选择
2.借助javascript
3.直接sendKeys()方法来实现传入一个时间的数据

  1. 关闭浏览器中quit和close的区别
    close是关闭你当前聚焦的tab页面,而quit是关闭全部浏览器tab页面,并退出浏览器session

8.页面加载超时
我们可以通过设置页面加载超时时间。具体代码是这个:driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS);

  1. 什么是JavaScript Executor,你什么时候会用到这个?
    JavaScript Executor是一个接口,给driver对象提供一个执行javaScript并访问和修改前端元素属性和值。
    JavascriptExecutor js =(JavascriptExecutor) driver;
    js.executeScript(Script,Arguments);

10.Selenium中如何实现截图
在Selenium中提供了一个TakeScreenShot这么一个接口,这个接口提供了一个getScreenshotAs()方法
self.driver.get_screenshot_as_file(img_path + nowTime + img_name + '.png')

11.Selenium中如何实现拖拽滚动条

12.介绍python+selenium+unittest+ddt web自动化框架

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

推荐阅读更多精彩内容