HTMLTestRunner下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html.该页面下载的HTMLTestRunner默认支持python2.x的,python3.x的需要修改相关的内容。

修改方式:

1.可将python2.x的下载之后自行网上寻找内容方法

2.文章后面上传了我修改后的HTMLTestRunner

注:本文使用谷歌浏览器61版本

主要介绍通过一些简单的例子来实现unittest和HTMLTestRunner的运用。并转换成测试报告。

准备步骤:下载HTMLTestRunner并放入python目录的lib文件夹下(这是我的,可以参考。E:\Program Files\Python36\Lib)

case:

1.百度网页输入框内容输入

2.移动鼠标将隐藏的元素显示出来

3.163邮箱登陆登陆

例子一:百度网页输入框内容输入

步骤:找到输入框元素并输入内容,然后点击按钮进行查询

# -*- coding: utf-8 -*-
"""
@__author__ :70486
@file: test_login01.py
@time: 2017/10/19 20:54
@项目名称:DemoTest
""" import unittest
from time import sleep from selenium import webdriver """
unittest框架中,优先执行setUp函数,所以一般在此函数中做一些准备工作。比如打开浏览器、打开网页、页面大小、等待时间等
tearDown函数是最后执行的。
如果想自动执行函数,函数名前缀必须是test_
"""
class Test1(unittest.TestCase):
def setUp(self):
#print "start!" #python2.7输出语句的写法
print("start!")
#打开谷歌。
self.driver = webdriver.Chrome("E:\drivers\Drivers\chromedriver59-61.exe")
#浏览器界面最大化
self.driver.maximize_window()
#打开网址
self.driver.get("https://www.baidu.com")
#设置网页加载超时时间
self.driver.implicitly_wait(30) def tearDown(self):
#print"end!"
print("end!")
#关闭浏览器
self.driver.close() def test_01(self):
print("通过id来搜索!")
#通过输入框id来找到元素
self.driver.find_element_by_id("kw").send_keys("通过id来输入")
#“百度一下”按钮的点击.通过js
rf = self.driver.find_element_by_id("su")
self.driver.execute_script("arguments[0].click();",rf)
#加延迟,方便查看
sleep(3) def test_02(self):
print("通过cssSelector来搜索!")
#通过输入框cssSelector来找到元素
self.driver.find_element_by_css_selector(".s_ipt").send_keys("通过cssSelector来输入")
# “百度一下”按钮的点击,按钮class名有空格我们可以用逗号来代替空格
self.driver.find_element_by_css_selector(".bg.s_btn").click()
# 加延迟,方便查看
sleep(3) def test_03(self):
print("通过name来搜索!")
#通过输入框name来找到元素
self.driver.find_element_by_name("wd").send_keys("通过name来输入")
# “百度一下”按钮的点击.通过父类层级关系来点击
self.driver.find_element_by_css_selector(".bg.s_btn_wr>input").click()
# 加延迟,方便查看
sleep(3) if __name__ == "__main__":
unittest.main()

单独运行这个代码有一个问题就是,每执行一个test_都会调用setUp和teatDown.

如果使用#setUpClass() 与 tearDownClass()就从头到尾只调用一次

例子二:移动鼠标将隐藏的元素显示出来

步骤:

1.移动鼠标

2.移动鼠标到某个元素,让隐藏元素显示

3.点击需要显示的隐藏元素

# -*- coding: utf-8 -*-
"""
@__author__ :70486
@file: test_move01.py
@time: 2017/10/19 21:35
@项目名称:DemoTest
""" import unittest
from time import sleep from selenium import webdriver
from selenium.webdriver import ActionChains """
任何自动化编写的前提就是:先手动执行一遍。 unittest框架中,优先执行setUp函数,所以一般在此函数中做一些准备工作。比如打开浏览器、打开网页、页面大小、等待时间等
tearDown函数是最后执行的。
如果想自动执行函数,函数名前缀必须是test_
""" class Demo_Move(unittest.TestCase):
@classmethod
def setUpClass(cls):
#print "start!" #python2.7输出语句的写法
print("start!")
#打开谷歌。
cls.driver = webdriver.Chrome("E:\drivers\Drivers\chromedriver59-61.exe")
#浏览器界面最大化
cls.driver.maximize_window()
#打开网址
cls.url = "https://www.baidu.com/"
cls.driver.get(cls.url)
#设置网页加载超时时间
cls.driver.implicitly_wait(30) @classmethod
def tearDownClass(cls):
#print"end!"
print("end!")
#关闭浏览器
cls.driver.close() """
移动鼠标到“设置”菜单,然后点击搜索设置,并点击保存设置
1.找到“设置元素”
2.定义ActionChains鼠标动作并执行
3.找到搜索设置并点击
4.找到“保存设置”按钮
5.通过js点击“保存设置”按钮
6.点击系统提示框的确定按钮
"""
def test_01(cls):
print("移动到设置菜单并开始点击!")
#1.找到“设置元素”
ele_pf = cls.driver.find_element_by_css_selector("#u1 > a.pf") #2.定义ActionChains鼠标动作并执行
# perform是执行链中的所有动作ActionChains动作
# move_to_element是移动鼠标到ele_pf元素
#链条式执行
ActionChains(cls.driver).move_to_element(ele_pf).perform()
sleep(3)#加延迟看效果 #3.找到搜索设置并点击
ele_setpref = cls.driver.find_element_by_css_selector("a.setpref")
ele_setpref.click()
sleep(2) # 加延迟看效果 #4.找到“保存设置”按钮
prefpanelgo = cls.driver.find_element_by_css_selector(".prefpanelgo") #5.通过js点击“保存设置”按钮
cls.driver.execute_script("arguments[0].click();",prefpanelgo)
#加延迟,方便查看
sleep(3) #6.点击系统提示框的确定按钮
'''获取alert对话框'''
alert = cls.driver.switch_to_alert()
alert.accept() # alert对话框属于警告对话框,我们这里只能接受弹窗 sleep(1)
print("移动查找执行完毕") """
移动鼠标到“更多产品”菜单,然后点击音乐,搜索自己喜欢的音乐
1.移动到“更多”
2.定义ActionChains鼠标动作并执行
3.找到音乐并点击
4.获取音乐页面的网址。判断是否进入成功:assert 表达式 [, 参数]
5.找到输入并输入“喜欢你”
6.通过js点击“百度一下”按钮进行搜索
7.判断搜索之后网址是否正确
8.通过返回按钮回到百度搜索页面
"""
def test_02(cls):
print("移动鼠标到“更多产品”菜单并开始点击!")
#1.移动到“更多”
ele_bri = cls.driver.find_element_by_css_selector(".bri") #2.定义ActionChains鼠标动作并执行
# perform是执行链中的所有动作ActionChains动作
# move_to_element是移动鼠标到ele_pf元素
# 分布式执行
action = ActionChains(cls.driver) #定义ActionChains对象
action.move_to_element(ele_bri) # 定义移动的动作
action.perform() #执行动作
sleep(2)#加延迟看效果 #3.找到音乐并点击
ele_span = cls.driver.find_element_by_css_selector("span.bdbriimgitem_3")
cls.driver.execute_script("arguments[0].click();", ele_span)
sleep(2) # 加延迟看效果 #4.获取音乐页面的网址。判断是否进入成功:assert 表达式 [, 参数]
assert "http://music.baidu.com"==cls.driver.current_url,"进入音乐失败"
print("成功进入音乐页面!") #5.找到输入并输入“喜欢你”
str = "喜欢你"
cls.driver.find_element_by_id("ww").send_keys(str) #6.通过js点击“百度一下”按钮进行搜索
s_btn = cls.driver.find_element_by_css_selector(".s_btn")
s_btn.submit()
sleep(5) #加延迟,方便查看 #7.判断搜索之后网址是否正确
assert "http://music.baidu.com/search?key=" + str == cls.driver.current_url,"音乐搜索失败"
print("成功搜索音乐!") #加延迟,方便查看
sleep(2) #8.通过返回按钮回到百度搜索页面
while cls.driver.current_url!=cls.url:
print("当前网址是:" + cls.driver.current_url + "需要再次返回")
cls.driver.back()
if cls.driver.current_url == "data:,":
print("返回出错,进入了初始页面:" + cls.driver.current_url)
break;
sleep(1)
if cls.driver.current_url != "data:,":
print("返回成功:" + cls.driver.current_url) print("搜索demo执行完毕") if __name__ == "__main__":
#创建类对象。
demo_move = Demo_Move()
unittest.main(demo_move)

这里使用了 unittest的setUpclass和tearDownClass,所以test执行的过程中都是使用了同一个页面。需要主要每个test中所在的页面是否需要重置

ActionChains的执行原理,当你调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用perform()方法时,队列中的时间会依次执行。

ActionChains方法列表

click(on_element=None) ——单击鼠标左键

click_and_hold(on_element=None) ——点击鼠标左键,不松开

context_click(on_element=None) ——点击鼠标右键

double_click(on_element=None) ——双击鼠标左键

drag_and_drop(source, target) ——拖拽到某个元素然后松开

drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开

key_down(value, element=None) ——按下某个键盘上的键

key_up(value, element=None) ——松开某个键

move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标

move_to_element(to_element) ——鼠标移动到某个元素

move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置

perform() ——执行链中的所有动作

release(on_element=None) ——在某个元素位置松开鼠标左键

send_keys(*keys_to_send) ——发送某个键到当前焦点的元素

send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素

assert断言的使用:前面放比较的参数,后面放失败的提示信息

浏览器导航页的返回、前进、刷新

driver.back() 
driver.forward() 
driver.refresh()

创建类对象的方法:demo_move  = Demo_Move()  :  参数名=类名

例子:163邮箱登陆

# -*- coding: utf-8 -*-
"""
@__author__ :70486
@file: test_login02.py
@time: 2017/10/19 23:28
@项目名称:DemoTest
""" import unittest
from time import sleep from selenium import webdriver """
unittest框架中,优先执行setUp函数,所以一般在此函数中做一些准备工作。比如打开浏览器、打开网页、页面大小、等待时间等
tearDown函数是最后执行的。
如果想自动执行函数,函数名前缀必须是test_
""" class Login_Demo(unittest.TestCase):
@classmethod
def setUp(self):
#print "start!" #python2.7输出语句的写法
print("start!")
#打开谷歌。
self.driver = webdriver.Chrome("E:\drivers\Drivers\chromedriver59-61.exe")
#浏览器界面最大化
self.driver.maximize_window()
#打开网址
self.driver.get("http://mail.163.com/")
#设置网页加载超时时间
self.driver.implicitly_wait(30) @classmethod
def tearDown(self):
#print"end!"
print("end!")
#关闭浏览器
self.driver.close() """
点击登录按钮进入输入账号密码
"""
def test_01(self):
print("登陆开始!")
#1.进入frame
ele_iframe = self.driver.find_element_by_css_selector("#x-URS-iframe")
self.driver.switch_to.frame(ele_iframe)
#2.找到账号密码输入框并输入内容
ele_user = self.driver.find_element_by_css_selector(".j-inputtext.dlemail")
ele_password = self.driver.find_element_by_css_selector(".j-inputtext.dlpwd")
ele_user.send_keys("userNema")
ele_password.send_keys("password")
sleep(2)
#3.点击登陆
self.driver.find_element_by_css_selector("#dologin").click()
#4.释放iframe,如果不释放就无法对iframe之后的元素进行操作
self.driver.switch_to.default_content() #5.点击退出,退出登陆
self.driver.find_element_by_css_selector("li#_mail_component_41_41>a").click() if __name__ == "__main__":
unittest.main()

如果有iframe要先进入在进行元素操作不然会出现找不到元素的错误,元素操作完成之后要退出操作

进入iframe:先找到元素,然后通过switch_to.frame进入

ele_iframe = self.driver.find_element_by_css_selector("#x-URS-iframe")
driver.switch_to.frame(ele_iframe)

释放iframe:

  driver.switch_to.default_content()

HTMLTestRunner 的 运行

# coding:utf-8
import unittest
import os
import HTMLTestRunner #os.getcwd() 是获取当前项目的目录
# 用例路径
case_path = os.path.join(os.getcwd(), "case") # 报告存放路径
report_path = os.path.join(os.getcwd(), "report") # html报告文件
report_abspath = os.path.join(report_path, "result.html") #pattern是定义,前缀为test的py文件
discover = unittest.defaultTestLoader.discover(case_path,
pattern="test*.py",
top_level_dir=None) fp = open(report_abspath, "wb")
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,
title=u'自动化测试报告,测试结果如下:',
description=u'用例执行情况:') # 调用add_case函数返回值
runner.run(discover)
fp.close()

右键就可以执行这个py文件了,然后把我们前面三个编写的文件一起执行。并且生成一个html文件

进入html的项目目录用浏览器打开就可以看到执行后的报告了

整个程序运行下来,工具运行日志也可以看出运行结果

在unittest中:
成功是 .,失败是 F,出错是 E,跳过是 S。

在全部class中一共执行了6个test。

注:

本人新手,如有写的不好希望可以留言修改请勿直接喷。。

至于我的谷歌启动方式:driver = webdriver.Chrome("E:\drivers\Drivers\chromedriver59-61.exe")

是因为chromedriver.exe驱动文件并没有配置到path中,。如果你已经配置了可以直接driver = webdriver.Chrome()启动

例子下载地址:

链接: https://pan.baidu.com/s/1pLzDT5D

密码: 56he

HTMLTestRunner下载地址

链接: https://pan.baidu.com/s/1bpljoTp

密码: t2zr

selenium3.4.3 + python3.6 + HTMLTestRunner0.8.0的更多相关文章

  1. Django:Python3.6.2+Django2.0配置MySQL

    持续学习Django中... Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据 ...

  2. 自己用到的解决Python3.6.5+Django2.0集成xadmin后台点击添加或者内容详情报 list index out of range 的错误的办法如下:

    Python3.6.5 Django2.0 这是Django版本与xadmin兼容的问题 解决办法如下: 注释掉如下代码: def render(self, name, value, attrs=No ...

  3. Django:Python3.6.2+Django2.0配置MySQL 转载

    Django默认使用的数据库是python自带的SQLlite3,但SQLlite并不适用于大型的项目,因此我将数据库换成了MySQL,下面介绍下Django如何配置数据库... 我使用的版本是:Py ...

  4. 循序渐进Python3(八) -- 0 -- 初识socket

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

  5. python3学习笔记(0)

    一.编程语言主要从以下几个角度分类:1.编译型和解释型2.静态语言和动态语言3.强类型定义语言和弱类型定义语言编译型:程序运行前先由负责翻译的程序将代码转换成可执行代码进行执行.例如C/C++.Pas ...

  6. 【终极答案】搭建selenium3.11 +Firefox+python3.6自动化UI测试环境踩的坑

    1 运行之后,出现如下报错 Selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs ...

  7. Python3.7+Pycharm+cuda10.0+tensorflow GPU版本 安装

    处理器:I5-7500 显卡   :GTX1050Ti 系统   :Win10 1. 首先搭建Python环境. 官网https://www.python.org/downloads/下载Python ...

  8. 使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_130 之前一篇文章是通过普通js+tornado来上传七牛云:使用Tornado配合七牛云存储api来异步切分上传文件,本次使用v ...

  9. 循序渐进Python3(十)-- 0 -- RabbitMQ

    RabbitMQ     RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息 ...

随机推荐

  1. (转载)Catalan数——卡特兰数

    Catalan数——卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1) ...

  2. python 去掉html中其他属性,只保留href 和 src

    https://segmentfault.com/q/1010000010845573 import re #reg=r'\s+[^(href)]*=\"[^<>]+\" ...

  3. HDU1755

    这道题直接暴力枚举复杂度为 n!*m 但是k<100 , 所以我们可以通过取模用dp[i][j] 表示k=i 时,-x取模k为j的最小值 #include <cstdio> #inc ...

  4. noip模拟赛 单词

    分析:这道题真心难想.最主要的是怎么样不重复. 为了不重复统计,把所有符合条件的单词分成两类,一类是某些单词的前缀,一类是 不是任何单词的前缀.涉及到前缀后缀,维护两个trie树,处理3个数组a,b, ...

  5. 【HDOJ6118】度度熊的交易计划(费用流)

    题意: 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个 ...

  6. Linux下汇编语言学习笔记13 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  7. SQL SERVER 自增字段相关问题

    SET IDENTITY_INSERT Data0048_TEST ON --给自增列赋值 DBCC CHECKIDENT(TableName) --查看某个表中的自增列当前的值 DBCC CHECK ...

  8. [bzoj4712]洪水_动态dp

    洪水 bzoj-4712 题目大意:给定一棵$n$个节点的有根树.每次询问以一棵节点为根的子树内,选取一些节点使得这个被询问的节点包含的叶子节点都有一个父亲被选中,求最小权值.支持单点修改. 注释:$ ...

  9. 携程Apollo(阿波罗)配置中心在Spring Boot项目快速集成

    前提:先搭建好本地的单机运行项目:http://www.cnblogs.com/EasonJim/p/7643630.html 说明:下面的示例是基于Spring Boot搭建的,对于Spring项目 ...

  10. TensorFlow-GPU环境配置之一——安装Ubuntu双系统

    本机已经安装过Windows系统,准备安装Ubuntu双系统进行TensorFlow相关工作,需要在windows中将磁盘分出一定空间供Ubuntu使用 1.首先下载Ubuntu17.04版本ISO ...