Python+Selenium笔记(三):使用unittest
#网络很慢可能会运行报错
(一) 前言
Selenium WebDriver是一个浏览器自动化测试的API集合。它提供了很多与浏览器自动化交互的特性,并且这些API主要是用于测试Web程序。如果仅仅使用Selenium WebDriver,我们无法实现执行测试前置条件、测试后置条件,比对预期结果和实际结果,检查程序的状态,生成测试报告,创建数据驱动的测试等功能。
(二) unittest单元测试框架
unittest(一般称为PyUnit)是从Java程序开发中广泛应用的JUnit启发而来的。unittest使我们具备创建测试用例、测试套件、测试夹具的能力。
(三) xUnite测试框架
Arrange:是用来初始化测试的前置条件,包含初始化被测试的对象、相关配置和依赖。
Act:用来执行功能操作。
Assert:用来校验实际结果与预期结果是否一致。
(四) TestCase类
通过继承TestCase类并且在测试类中为每一个测试添加测试方法来创建单个测试或者一组测试。
(五) 使用unittest
(1) 定义一个继承于TestCase 类的子类。
(2) 在类中定义setUp()方法。
(3) 编写测试方法
(4) 代码清理(在类中定义tearDown()方法)
(5) 运行测试
说明:
1、 一个测试用例是从setUp()方法开始执行的,我们可以用这个方法在每个测试开始前去执行一些初始化的任务。可以是这样的初始化准备:比如创建浏览器实例,访问URL,加载测试数据和打开日志文件等。此方法没有参数,而且不返回任何值。当定义了一个setUp()方法,测试执行器在每次执行测试方法之前优先执行该方法。
2、 有了setUp()方法,就可以写一些测试用来验证我们想要测试的程序的功能。测试方法命名以test开头,这种命名约定通知test runner哪个方法代表测试方法。
3、 类似于setUp()方法在每个测试方法之前被调用,TestCase类也会在测试执行完成之后调用tearDown()方法来清理所有的初始化值。一旦测试被执行,在setUp()方法中定义的值将不再需要,所以最好的做法是在测试执行完成的时候清理掉由setUp()方法初始化的数值。
(六) 新建一个目录 data ,创建一个文件category.txt,录入以下数据
编程语言,Java,C++,PHP,Delphi,Python,Ruby,C语言,Erlang,Go,Swift,Scala,R语言,Verilog,其它语言

(七) 测试博客园首页编程语言下的分类信息是否与预期结果一致
import unittest
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
class SearchTest (unittest.TestCase):
def setUp(self):
self.driver
= webdriver.Firefox()
self.driver.implicitly_wait(10)
self.driver.maximize_window()
self.driver.get("https://www.cnblogs.com/")
def test_search_by_category(self):
#读取category.txt文件,返回一个字典
with open('data/category.txt', encoding='UTF-8') as category_file:
category_dict = dict()
category_data =
category_file.readline().strip().split(',')
the_class =
category_data.pop(0)
category_dict[the_class] =
category_data
#定位首页网站分类中的编程语言
self.seach_class = self.driver.find_element_by_xpath('//li/a[@href="/cate/2/"]')
#光标悬停在“编程语言”上
ActionChains(self.driver).move_to_element(self.seach_class).perform()
# 以列表形式返回编程语言下的所有小类
seach_small = self.driver.find_elements_by_xpath( '//div[@id="cate_content_block_2"]/div[@class="cate_content_block"]/ul/li')
#休眠3秒
time.sleep(3)
small_cate = []
for s in seach_small:
#去掉小类最后面的3个字符(0),并添加到列表small_cate中
small_cate.append(str(s.text)[:-3])
#检查表达式是否为true(此处检查编程语言下的小类是否与预期结果一致)
self.assertTrue(small_cate == category_dict["编程语言"])
# self.assertEqual(small_cate,category_dict["编程语言"])
def tearDown(self):
self.driver.quit()
#加上下面2句,可以通过命令行运行测试,不加的话不影响通过IDE运行测试
if __name__ == '__main__':
#加verbosity=2参数,在命令行中显示具体的测试方法
unittest.main(verbosity=2)
(八)
测试结果如下

通过命令行运行:

Python+Selenium笔记(三):使用unittest的更多相关文章
- Python+selenium之简单介绍unittest单元测试框架
Python+selenium之简单介绍unittest单元测试框架 一.unittest简单介绍 unittest支持测试自动化,共享测试用例中的初始化和关闭退出代码,在unittest中最小单元是 ...
- Python+Selenium笔记(九):操作警告和弹出框
#之前发的 driver.switch_to_alert() 这句虽然可以运行通过,但是会弹出警告信息(这种写法3.x不建议使用) 改成 driver.switch_to.alert就不会了. (一 ...
- Python&Selenium 数据驱动测试【unittest+ddt+xml】
一.摘要 本博文将介绍Python和Selenium做自动化测试时,基于unittest框架,借助ddt模块,使用xml文件作为测试输入. 二.xml文件 保存路径:D:\\Programs\\Pyt ...
- Python+Selenium笔记(十四)鼠标与键盘事件
(一) 前言 Webdriver高级应用的API,允许我们模拟简单到复杂的键盘和鼠标事件,如拖拽操作.快捷键组合.长按以及鼠标右键操作,都是通过使用webdriver的Python API 中的Ac ...
- Python+Selenium笔记(八):操作下拉菜单
(一) Select类 Select类是selenium的一个特定的类,用来与下拉菜单和列表交互. 下拉菜单和列表是通过HTML的<select> 元素实现的.选择项是通过<sele ...
- Python 学习笔记三
笔记三:函数 笔记二已取消置顶链接地址:http://www.cnblogs.com/dzzy/p/5289186.html 函数的作用: 給代码段命名,就像变量給数字命名一样 可以接收参数,像arg ...
- Python+Selenium笔记(十六)屏幕截图
(一) 方法 方法 简单说明 save_screenshot(filename) 获取当前屏幕截图并保存为指定文件 filename:路径/文件名 get_screenshot_as_base64 ...
- Python+Selenium笔记(四):unittest的Test Suite(测试套件)
(一) Test Suite测试套件 一个测试套件是多个测试或测试用例的集合,是针对被测程序的对应的功能和模块创建的一组测试,一个测试套件内的测试用例将一起执行. 应用unittest的TestSui ...
- Python+Selenium笔记(十八):持续集成jenkins
(一)安装xmlrunner 使用Jenkins执行测试时,测试代码中会用到这个模块. pip install xmlrunner (二)安装jenkins (1) 下载jekins https: ...
随机推荐
- 再学Java 之 interface的成员变量
前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然 ...
- 【从0到1学jQuery】jQuery中each()和$.each()的使用
引子: 最近遇到一个问题,就是在each()函数中怎么模拟for循环中的break和continue的操作.所以就查看了jQuery关于这个函数的文档,并且总结一下. 演示代码如下: <div& ...
- 解析BroadcastReceiver之你需要了解的一些东东
前些天把四大组件之一的Service扯了一遍,今天就要开始谈谈它的弟兄BroadcastReceiver了.写到这里我挺纠结的,因为广播接收者确实比较简单,但是各位就不要以为简单的就不内涵,也许我们慢 ...
- Android _关于fragment切换重新加载的解决分享给大家
在项目中需要进行Fragment的切换,一直都是用replace()方法来替换Fragment但是,这样会有一个问题 ,应该很多朋友都遇到过:每次切换的时候,Fragment都会重新实例化,也就是运行 ...
- 开发工具 -- Eclipse快捷键
[ALT+/]此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类.方法和属性的名字时,多体验一下[ALT+/]快捷键带来的好处吧. [Ctrl+O]显示 ...
- Hadoop2源码分析-Hadoop V2初识
1.概述 在完成分析Hadoop2源码的准备工作后,我们进入到后续的源码学习阶段.本篇博客给大家分享,让大家对Hadoop V2有个初步认识,博客的目录内容如下所示: Hadoop的渊源 Hadoop ...
- Java队列——Disruptor 的使用
.什么是 Disruptor 从功能上来看,Disruptor 是实现了“队列”的功能,而且是一个有界队列.那么它的应用场景自然就是“生产者-消费者”模型的应用场合了. 可以拿 JDK 的 Bloc ...
- Vue源码之 virtual-dom 实现简析
发现两篇写得特别好的博文,仔细通读,发现豁然开朗. 浅析Vue 中的patch和diff Vue 2.0 的 virtual-dom 实现简析
- JavaScript之String总汇
一.常用属性 ·length:返回字符串中字符长度 let str = 'asd '; str.length = 1;//无法手动修改,只读 console.log(str.length);//4 二 ...
- SQL Server T—SQL 函数
一 聚合函数(统计函数)!!!!! 计算个数 count( ) select count(*) from 表名 求和 sum( ) select sum(列名) from 表名 求平均数 ...