zoukankan      html  css  js  c++  java
  • 自动化进阶

    一、python邮件发送

    import smtplib  # 发送邮件模块
    from email.mime.text import MIMEText  # 定义邮件内容
    from email.header import Header  # 定义邮件标题
    
    # 发送邮箱服务器
    smtpserver = "smtp.163.com"
    
    # 发送邮箱用户名密码
    username = "n18604459833@163.com"
    password = "123456"
    
    # 发送和接收邮箱
    sender = "n18604459833@163.com"
    receive = "li17802929732@126.com"
    
    #发送邮件主题和内容
    subject = "Web Selenium 自动化测试报告"
    content = '<html><h1 style="color:red">我要自学网,自学成才</h1></html>'
    
    #HTML邮件正文
    msg = MIMEText(content, 'html', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = 'n18604459833@163.com'
    msg['To'] = 'li17802929732@126.com'
    
    #SSL协议端口使用465
    smtp = smtplib.SMTP_SSL(smtpserver, 465)
    #向服务器标适识用户身份
    smtp.helo(smtpserver)
    #服务器返回结果确认
    smtp.ehlo(smtpserver)
    #登录邮箱服务器用户名和密码
    smtp.login(username, password)
    
    print("Start send Email...")
    smtp.sendmail(sender, receive, msg.as_string())
    smtp.quit()
    print("Send Email end")
    

    二、邮件同时发送给多人

    import smtplib  # 发送邮件模块
    from email.mime.text import MIMEText  # 定义邮件内容
    from email.header import Header  # 定义邮件标题
    
    # 发送邮箱服务器
    smtpserver = "smtp.163.com"
    
    # 发送邮箱用户名密码
    username = ''
    password = ''
    
    # 发送和接收邮箱
    sender = ''
    receives = ['', '']
    
    # 发送邮件主题和内容
    subject = "Web Selenium 自动化测试报告"
    content = '<html><h1 style="color:red">我要自学网,自学成才</h1></html>'
    
    # HTML邮件正文
    msg = MIMEText(content, 'html', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = sender
    msg['To'] = '.'.join(receives)
    
    # SSL协议端口使用465
    smtp = smtplib.SMTP_SSL(smtpserver, 465)
    # 向服务器标适识用户身份
    smtp.helo(smtpserver)
    # 服务器返回结果确认
    smtp.ehlo(smtpserver)
    # 登录邮箱服务器用户名和密码
    smtp.login(username, password)
    
    print("Start send Email...")
    smtp.sendmail(sender, receives, msg.as_string())
    smtp.quit()
    print("Send Email end")
    

    三、发送带附件的邮件

    '''
    发送logo.png图片文件到指定到邮箱
    '''
    
    import smtplib  # 发送邮件模块
    from email.mime.text import MIMEText  # 定义邮件内容
    from email.mime.multipart import MIMEMultipart  # 用于传送附件
    
    # 发送邮箱服务器
    smtpserver = "smtp.163.com"
    
    # 发送邮箱用户名密码
    username = ''
    password = ''
    
    # 发送和接收邮箱
    sender = ''
    receives = ['', '']
    
    # 发送邮件主题和内容
    subject = "Web Selenium 自动化测试报告"
    content = '<html><h1 style="color:red">我要自学网,自学成才</h1></html>'
    
    # 构造附件内容
    send_file = open(r'E:pythonlogo.png', 'rb').read()
    
    att = MIMEText(send_file, 'base64', 'utf-8')
    att['Content-Type'] = 'application/octet-stream'
    att['Content-Disposition'] = 'attachment;filename="logo.png"'
    
    # 构建发送和接收信息
    msgRoot = MIMEMultipart()
    msgRoot.attach(MIMEText(content, 'html', 'utf-8'))
    msgRoot['Subject'] = subject
    msgRoot['From'] = sender
    msgRoot['To'] = ','.join(receives)
    msgRoot.attach(att)
    
    # SSL协议端口使用465
    smtp = smtplib.SMTP_SSL(smtpserver, 465)
    # 向服务器标适识用户身份
    smtp.helo(smtpserver)
    # 服务器返回结果确认
    smtp.ehlo(smtpserver)
    # 登录邮箱服务器用户名和密码
    smtp.login(username, password)
    
    print("Start send Email...")
    smtp.sendmail(sender, receives, msgRoot.as_string())
    smtp.quit()
    print("Send Email end")
    

    四、整合测试报告发送

    1、获取某目录下最新的测试报告

    '''
    获取某目录下最新的测试报告
    '''
    
    import os  # 用于访问操作系统功能的模块
    
    # 报告存放位置
    report_dir = './test_report'
    
    lists = os.listdir(report_dir)  # 方法用于返回指定的文件夹包含的文件或文件夹的名字列表
    print(lists)
    
    # 按时间顺序对该目录文件夹下面的文件进行排序
    lists.sort(key=lambda fn: os.path.getatime(report_dir + '\' + fn))
    
    print("the latest report is " + lists[-1])
    
    # 输出最新报告的文件
    file = os.path.join(report_dir, lists[-1])
    print(file)
    

     2、整合测试报告发送

    import unittest
    from BSTestRunner import BSTestRunner
    import time
    import smtplib  # 发送邮件模块
    from email.mime.text import MIMEText  # 定义邮件内容
    from email.header import Header  # 定义邮件标题
    import os
    
    
    def send_mail(latest_report):
        f = open(latest_report, 'rb')
        mail_content = f.read()
        f.close()
    
        # 发送邮箱服务器
        smtpserver = "smtp.163.com"
    
        # 发送邮箱用户名密码
        username = ''
        password = ''
    
        # 发送和接收邮箱
        sender = ''
        receives = ['', '']
    
        # 发送邮件主题和内容
        subject = "Web Selenium 自动化测试报告"
        # content = '<html><h1 style="color:red">我要自学网,自学成才</h1></html>'
    
        # HTML邮件正文
        msg = MIMEText(mail_content, 'html', 'utf-8')
        msg['Subject'] = Header(subject, 'utf-8')
        msg['From'] = sender
        msg['To'] = '.'.join(receives)
    
        # SSL协议端口使用465
        smtp = smtplib.SMTP_SSL(smtpserver, 465)
        # 向服务器标适识用户身份
        smtp.helo(smtpserver)
        # 服务器返回结果确认
        smtp.ehlo(smtpserver)
        # 登录邮箱服务器用户名和密码
        smtp.login(username, password)
    
        print("Start send Email...")
        smtp.sendmail(sender, receives, msg.as_string())
        smtp.quit()
        print("Send Email end")
    
    
    def latest_report(report_dir):
        lists = os.listdir(report_dir)  # 方法用于返回指定的文件夹包含的文件或文件夹的名字列表
        print(lists)
    
        # 按时间顺序对该目录文件夹下面的文件进行排序
        lists.sort(key=lambda fn: os.path.getatime(report_dir + '\' + fn))
    
        print("the latest report is " + lists[-1])
    
        # 输出最新报告的文件
        file = os.path.join(report_dir, lists[-1])
        print(file)
        return file
    
    
    if __name__ == '__main__':
        # 存放报告的文件夹
        report_dir = './test_report'
        # 定义测试用例路径
        test_dir = './test_case'
    
        discovery = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")
    
        # 报告命名时间格式化
        now = time.strftime("%Y-%m-%d %H_%M_%S")
        # 报告文件完整路径
        report_name = report_dir + '/' + now + 'result.html'
    
        # 打开文件在报告文件写入测试结果
        with open(report_name, "wb") as f:
            runner = BSTestRunner(stream=f, title="Test Report", description="Test Case Result")
            runner.run(discovery)
    
        latest_report=latest_report(report_dir)
        send_mail(latest_report)
    

    五、补充知识点

    1、By方式定位元素

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from time import sleep
    
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    driver.implicitly_wait(5)
    
    driver.find_element(By.ID, "kw").clear()
    driver.find_element(By.NAME, 'wd').send_keys("selenium")
    driver.find_element(By.CLASS_NAME, 's_ipt').send_keys("自学网")
    driver.find_element(By.CSS_SELECTOR, '#kw').send_keys("python")
    sleep(3)
    
    driver.find_element(By.ID, 'su').click()
    sleep(2)
    
    driver.quit()
    

    2、方法参数的个数

    def fun_args1(args):
        print("args is %s" % args)
    
    
    def fun_args2(args1, args2):
        print("args1 is %s args2 is %s" % (args1, args2))
    
    
    # 可变参数
    def fun_var_args(*args):
        for value in args:
            print("args : %s" % value)
        print("================")
    
    
    if __name__ == '__main__':
        fun_args1('zxw')
        fun_args2('test', 'jiayou')
        print("-------------------")
        fun_var_args()
        fun_var_args("zxw")
        fun_var_args('zxw', 'test', 'jiayou')
    

    六、自动化测试设计模式Page Object
    Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素和功能模块的封装减少冗余代码,同时在后期维护中,若元素定位或功能模块发生变化,只需要调整页面或功能模块封装的代码,提高测试用例的可维护性。

    base_page.py

    from time import sleep
    
    '''页面基础类'''
    
    
    class Page():
        # 初始化
        def __init__(self, driver):
            self.driver = driver
            self.base_url = 'http://localhost'
            self.timeout = 10
    
        # 打开不同的子页面
        def _open(self, url):
            url_ = self.base_url + url
            print("Test page is %s" % url_)
            self.driver.maximize_window()
            self.driver.get(url_)
            sleep(2)
            assert self.driver.current_url == url_, 'Did not land on %s' % url_
    
        def open(self):
            self._open(self.url)
    
        # 元素定位方法封装
        def find_element(self, *loc):
            return self.driver.find_element(*loc)
    

    login_page.py

    from base_page import *
    from selenium.webdriver.common.by import By
    
    
    class LoginPage(Page):
        '''首页登录页面'''
    
        url = '/'
    
        # 定位器
        username_loc = (By.NAME, 'username')
        password_loc = (By.NAME, 'password')
        submit_loc = (By.NAME, 'Submit')
    
        # 用户名输入框元素
        def type_username(self, username):
            self.find_element(*self.username_loc).clear()
            self.find_element(*self.username_loc).send_keys(username)
    
        # 密码输入框元素
        def type_password(self, password):
            self.find_element(*self.password_loc).clear()
            self.find_element(*self.password_loc).send_keys(password)
    
        # 登录按钮元素
        def type_submit(self):
            self.find_element(*self.submit_loc).click()
    
    
    # 登录功能模块封装
    def test_user_login(driver, username, password):
        '''测试用户名密码是否可以登录'''
        login_page = LoginPage(driver)
        login_page.open()
    
        login_page.type_username(username)
        login_page.type_password(password)
        login_page.type_submit()
    

    test_login.py

    from login_page import *
    from selenium import webdriver
    
    driver = webdriver.Firefox()
    
    username = 'zxw'
    password = '123456'
    
    if __name__ == '__main__':
        test_user_login(driver, username, password)
        sleep(2)
        driver.quit()
    

    七、自动化测试综合实战

    项目背景:新闻子页面进行登录测试
    功能实现:
    自动运行用例
    自动生成测试报告
    自动断言与截图
    自动将最新测试报告发送到指定邮箱
    PageObject+Unittest

     代码组织结构如下: 

     driver.py

    from selenium import webdriver
    
    
    def browser():
        driver = webdriver.Firefox()
        # driver = webdriver.Chrome()
        # driver = webdriver.Ie()
        driver = webdriver.IeOptions()
    
        # driver.get("http://www.baidu.com")
    
        return driver
    

     function.py

    from selenium import webdriver
    import os
    import smtplib  # 发送邮件模块
    from email.mime.text import MIMEText  # 定义邮件内容
    from email.header import Header  # 定义邮件标题
    
    
    def insert_img(driver, filename):
        func_path = os.path.dirname(__file__)
        print(func_path)
    
        base_dir = os.path.dirname(func_path)
        print(base_dir)
    
        base_dir = str(base_dir)
        # 绝对路径转换为相对路径
        dir = base_dir.replace('\', '/')
        print(dir)
    
        base = dir.split('/website')
        print(base)
    
        filepath = base + '/website/test_report/screenshot/' + filename
        driver.get_screenshot_as_file(filepath)
    
    
    def send_mail(latest_report):
        f = open(latest_report, 'rb')
        mail_content = f.read()
        f.close()
    
        # 发送邮箱服务器
        smtpserver = "smtp.163.com"
    
        # 发送邮箱用户名密码
        username = ''
        password = ''
    
        # 发送和接收邮箱
        sender = ''
        receives = ['', '']
    
        # 发送邮件主题和内容
        subject = "Web Selenium 自动化测试报告"
        # content = '<html><h1 style="color:red">我要自学网,自学成才</h1></html>'
    
        # HTML邮件正文
        msg = MIMEText(mail_content, 'html', 'utf-8')
        msg['Subject'] = Header(subject, 'utf-8')
        msg['From'] = sender
        msg['To'] = '.'.join(receives)
    
        # SSL协议端口使用465
        smtp = smtplib.SMTP_SSL(smtpserver, 465)
        # 向服务器标适识用户身份
        smtp.helo(smtpserver)
        # 服务器返回结果确认
        smtp.ehlo(smtpserver)
        # 登录邮箱服务器用户名和密码
        smtp.login(username, password)
    
        print("Start send Email...")
        smtp.sendmail(sender, receives, msg.as_string())
        smtp.quit()
        print("Send Email end")
    
    
    def latest_report(report_dir):
        lists = os.listdir(report_dir)  # 方法用于返回指定的文件夹包含的文件或文件夹的名字列表
        print(lists)
    
        # 按时间顺序对该目录文件夹下面的文件进行排序
        lists.sort(key=lambda fn: os.path.getatime(report_dir + '\' + fn))
    
        print("the latest report is " + lists[-1])
    
        # 输出最新报告的文件
        file = os.path.join(report_dir, lists[-1])
        print(file)
        return file
    
    
    if __name__ == '__main__':
        driver = webdriver.Firefox()
        driver.get("http://www.sogou.com")
        insert_img(driver, 'sougou.jpg')
        driver.quit()
    

     myunit.py

    import unittest
    from driver import *
    
    
    class StartEnd(unittest.TestCase):
        def setUp(self):
            self.driver = browser()
            self.driver.implicitly_wait(10)
            self.driver.maximize_window()
    
        def tearDown(self):
            self.driver.quit()
    

     base_page.py

    from time import sleep
    
    '''页面基础类'''
    
    
    class Page():
        # 初始化
        def __init__(self, driver):
            self.driver = driver
            self.base_url = 'http://localhost'
            self.timeout = 10
    
        # 打开不同的子页面
        def _open(self, url):
            url_ = self.base_url + url
            print("Test page is %s" % url_)
            self.driver.maximize_window()
            self.driver.get(url_)
            sleep(2)
            assert self.driver.current_url == url_, 'Did not land on %s' % url_
    
        def open(self):
            self._open(self.url)
    
        # 元素定位方法封装
        def find_element(self, *loc):
            return self.driver.find_element(*loc)
    

     login_page.py

    from base_page import *
    from selenium.webdriver.common.by import By
    
    
    class LoginPage(Page):
        '''首页登录页面'''
    
        url = '/news/'
    
        # 定位器
        username_loc = (By.NAME, 'username')
        password_loc = (By.NAME, 'password')
        submit_loc = (By.NAME, 'Submit')
    
        # 用户名输入框元素
        def type_username(self, username):
            self.find_element(*self.username_loc).clear()
            self.find_element(*self.username_loc).send_keys(username)
    
        # 密码输入框元素
        def type_password(self, password):
            self.find_element(*self.password_loc).clear()
            self.find_element(*self.password_loc).send_keys(password)
    
        # 登录按钮元素
        def type_submit(self):
            self.find_element(*self.submit_loc).click()
    
        # 登录功能模块封装
        def login_action(self, username, password):
            self.open()
            self.type_username(username)
            self.type_password(password)
            self.type_submit()
    
        # 断言元素定位
        login_pass_loc = (By.LINK_TEXT, '我的空间')
        login_fail_loc = (By.NAME, 'username')
    
        def type_login_pass_hint(self):
            return self.find_element(*self.login_pass_loc).text
    
        def type_login_fail_hint(self):
            return self.find_element(*self.login_fail_loc).text
    

     test_login.py

    import unittest
    from model import function, myunit
    from page_object.login_page import *
    from time import sleep
    
    '''
    unittest组织测试用例
    1、用户名密码正确点击登录
    2、用户名正确,密码错误点击登录
    3、用户名和密码为空点击登录
    '''
    
    
    class LoginTest(myunit.StartEnd):
        @unittest.skip("skip normal login")
        def test_login1_normal(self):
            '''username and password is normal'''
            print("test_login_normal is start test...")
            po = LoginPage(self.driver)
            po.login_action('zxw', '123456')
            sleep(2)
    
            self.assertEqual(po.type_login_pass_hint(), "我的空间")
            function.insert_img(self.driver, "zxw_login1_normal.jpg")
            print("test_login1_normal test end")
    
        def test_login2_password_error(self):
            '''username is ok,password is error'''
            print("test_login2_password_error is start test...")
            po = LoginPage(self.driver)
            po.login_action('zxw', '666')
            sleep(2)
    
            self.assertEqual(po.type_login_fail_hint(), '')
            function.insert_img(self.driver, 'test_login2_password_error.jpg')
    
        def test_login3_empty(self):
            '''username and password is empty'''
            print('test_login3_empty is start test...')
            po = LoginPage(self.driver)
            po.login_action('', '')
            sleep(2)
    
            self.assertEqual(po.type_login_fail_hint(), '')
            function.insert_img(self.driver, 'test_login3_empty.jpg')
            print("test_login3_empty test end")
    
    
    if __name__ == '__main__':
        unittest.main()
    

     run_test.py

    import unittest
    from function import *
    from BSTestRunner import BSTestRunner
    import time
    
    report_dir = './test_report'
    test_dir = './test_case'
    
    print("start run test case")
    discover = unittest.defaultTestLoader.discover(test_dir, pattern="test_login.py")
    
    now = time.strftime('%Y-%m-%d %H_%M_%S')
    report_name = report_dir + '/' + now + 'result.html'
    
    print('start write report...')
    with open(report_name, 'wb') as f:
        runner = BSTestRunner(stream=f, title='Test Report', description='localhost login test')
        runner.run(discover)
    
    print('find latest report')
    latest_report = latest_report(report_dir)
    
    print("send email report...")
    send_mail(latest_report)
    
    print("Test end")
    
  • 相关阅读:
    docker run 参数含义
    java——数组队列 ArrayQueue
    java——数组栈 ArrayStack
    java——时间复杂度、动态数组
    java——异常类、异常捕获、finally、异常抛出、自定义异常
    java——变量
    java——虚拟机、线程
    java——内部类
    java——object类
    java——抽象类、接口、二者区别
  • 原文地址:https://www.cnblogs.com/xidian2014/p/10425002.html
Copyright © 2011-2022 走看看