• 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 FilesPython36Lib)

    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:driversDriverschromedriver59-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:driversDriverschromedriver59-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:driversDriverschromedriver59-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:driversDriverschromedriver59-61.exe")

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

    例子下载地址:

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

    密码: 56he

    HTMLTestRunner下载地址

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

    密码: t2zr

  • 相关阅读:
    Java8IntStream数值流的常用操作以及与装箱和拆箱的关系
    iOS滚动回弹修复方案
    ios Safari 不兼容问题 transform rotateY
    typescript的?? 和?: 和?.是什么意思?还有!:
    原生js解决ios手机input输入框弹出覆盖问题
    requestIdleCallback和requestAnimationFrame的区别
    axios的兼容性问题
    第三方直播SDK对比(腾讯云,阿里云,网易云信,七牛云,金山云,声网,即构科技)
    直播平台对比
    react中实现路由缓存和组件缓存
  • 原文地址:https://www.cnblogs.com/xiaodingdong/p/7696740.html
Copyright © 2020-2023  润新知