selenium3.4.3 + python3.6 + HTMLTestRunner0.8.0

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.点击需要显示的隐藏元素

4.做相应的操作

# -*- 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的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 6 安装python3.6

选择 Python3.6 还是 Python 3.7

ubuntu16.04 安装 python3.6, 并创建虚拟环境(使用python3.6)

安装Python3.6.x

python3.6 安装

python3.6