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")
    
  • 相关阅读:
    线性代数思维导图——3.向量
    微分中值定理的基础题型总结
    构造函数
    Python课程笔记(七)
    0241. Different Ways to Add Parentheses (M)
    0014. Longest Common Prefix (E)
    0013. Roman to Integer (E)
    0011. Container With Most Water (M)
    0010. Regular Expression Matching (H)
    0012. Integer to Roman (M)
  • 原文地址:https://www.cnblogs.com/xidian2014/p/10425002.html
Copyright © 2011-2022 走看看