selenium3.4.3 + python3.6 + HTMLTestRunner0.8.0
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