python+selenium自动化学习四:Excel数据驱动模型框架搭建

一.框架目录介绍:

    config:  

    1.config.ini:存放浏览器名称和登录url地址   

    2.logger.ini:配置获取自动化的日志脚本

    

  data:  

    1.test_data.xlsx:存放测试数据

    

  logs:  

    1.tes.log:存放执行自动化过程的日志

    

  page:  

    1.common.py:存放封装的方法

    

  report:  

    1.test_report.html:存放测试报告  

    2.screenshots:存放截图

    

  testcase:  

    1.test_case.py:存放测试用例

    

  utils:  

    1.driver.py:获取webdiiver  

    2.logger.py配置日志处理器  

    3.read_config.py:读取config文件夹的文件  

    4.take_screenshot.py:存放测试截图

    

  run.py:测试执行入口

  send_emails:发送测试报告邮件

    

二.编写文件:

  文件夹按上面的目录新建即可,每个文件夹下面有一个__init__.py的空文件,用于指示 Python 解释器将该目录视为一个包(package),如果没有这个文件,Python 不会将该目录作为包来处理,PyCharm打开测试包的时候可能会显示相关的错误或警告,提示你需要添加这个文件以使其成为一个有效的包。

  config文件夹:

    cmd命令创建两个文件:

      切换到config文件夹cd config

      创建文件:touch __init__.py config.ini logger.ini

    编写文件内容:

  1.config:  

[Browser]
browser_name = chrome
[URL]
base_url = https://uat01-emp.iccec.cn/

    2.logger.ini:存放日志

[loggers]
keys=root

[handlers]
keys=consoleHandler,fileHandler

[formatters]
keys=formatter

[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler

[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=formatter
args=(sys.stdout,)

[handler_fileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=formatter
args=('logs/test.log','D',1,30)

[formatter_formatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=%Y-%m-%d %H:%M:%S

下面创建文件的方式同上面的一致,切换到对应的文件夹下,用touch命令创建文件

  utils:

    1.driver.py:

import os
from selenium import webdriver
from configparser import ConfigParser
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

def get_driver():
    config = ConfigParser()
    config.read(os.path.join(os.path.dirname(__file__), '../config/config.ini'))
    browser_name = config.get('Browser', 'browser_name')

    if browser_name.lower() == 'chrome':
        # 设置 chromedriver 路径
        service = Service('D:\\Automation\\Selenium\\chromedriver125\\chromedriver.exe')

        # 初始化 Chrome WebDriver
        driver = webdriver.Chrome(service=service, options=options)

        return driver
    # 根据配置文件中指定的其他浏览器名称,选择并返回相应的WebDriver实例
    elif browser_name.lower() == 'firefox':
        # 初始化 Firefox WebDriver
        return webdriver.Firefox()
    elif browser_name.lower() == 'edge':
        # 初始化 Edge WebDriver
        return webdriver.Edge()
    else:
        raise ValueError('Unsupported browser: {}'.format(browser_name))

def maxWindow():
    return None


def maximize_window():
    return None

    2.logger.py:

import os
from loguru import logger
from configparser import ConfigParser

config = ConfigParser()
config.read(os.path.join(os.path.dirname(__file__),'../config/logger.ini'))

rotation = int(config.get('handler_fileHandler', 'args').split(',')[2].strip(')'))
retention = int(config.get('handler_fileHandler', 'args').split(',')[3].strip(')'))
def get_logger(name):
    return logger.bind(name=name)

    3.read_config.py:

import os
from configparser import ConfigParser

config = ConfigParser()
config.read(os.path.join(os.path.dirname(__file__),'../config/config.ini'))

def get_base_url():
    return config.get('URL','base_url')

    4.take_screenshot.py:

import os
from datetime import datetime
from utils.driver import get_driver

def take_screenshot(name):
    driver = get_driver()
    screenshot_dir = os.path.join(os.path.dirname(__file__),'../report/screenshots')
    os.makedirs(screenshot_dir, exist_ok=True)
    screenshot_file = os.path.join(screenshot_dir,'{}_{}.png'.format(name, datetime.now().strftime('%Y-%m-%d_%H-%M-%S')))
    driver.save_screenshot(screenshot_file)

    5.在common文件夹common.py写一个登录的方法:

from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import openpyxl
from selenium.common.exceptions import NoSuchElementException

class LoginPage:
    username_input = (By.NAME,"username")
    password_input = (By.NAME,"password")
    login_button = (By.NAME,"submit")

    def __init__(self):
        self.driver = get_driver()

    def open(self):
        self.driver.get(get_base_url())

    def close(self):
        self.driver.quit()

    def maxwindow(self):
        self.driver.maximize_window()

    # 登录系统
    def login(self, username, password):
        # 1.点击登录按钮
        login_button = self.driver.find_element(By.CLASS_NAME, 'app-item')
        login_button.click()

        # 2.输入用户名和密码
        self.driver.find_element(*self.username_input).clear()
        self.driver.find_element(*self.username_input).send_keys(username)
        self.driver.find_element(*self.password_input).clear()
        self.driver.find_element(*self.password_input).send_keys(password)


        # 4.点击登录按钮
        self.driver.find_element(By.ID,'passSubmit').click()
        time.sleep(5)

    6.testcase文件夹下写一个测试文件:  

      test_case.py:

import unittest
from common.login_page import LoginPage
from utils.take_screenshot import take_screenshot
 
class TestLogin(unittest.TestCase):
    def setUp(self):
        self.page = LoginPage()
 
    def tearDown(self):
        self.page.close()
 
    def test_login_success(self):
        self.page.open()
        self.page.login('admin', 'admin123')
        self.assertIn('Welcome', self.page.driver.title)
 
    def test_login_failure(self):
        self.page.open()
        self.page.login('admin', 'wrong_password')
        self.assertIn('Login failed', self.page.driver.page_source)
        take_screenshot('test_login_failure')

   7.run.py运行代码:

import unittest
from datetime import datetime
from utils.logger import get_logger
from report import HTMLTestRunner
 
logger = get_logger(__name__)
 
if __name__ == '__main__':
    logger.info('Start testing...')
    suite = unittest.defaultTestLoader.discover('testcase')
    report_file = 'report/test_report_{}.html'.format(datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
    with open(report_file, 'wb') as f:
        runner = HTMLTestRunner.HTMLTestRunner(stream=f, title='Test Report', description='Test Result')
        runner.run(suite)
    logger.info('Testing finished. Report file: {}'.format(report_file))

   # 将截图嵌入报告
    with open(report_file, 'r+', encoding='utf-8') as f:
        content = f.read()
        for root, dirs, files in os.walk('report/screenshots'):
            for file in files:
                screenshot_file = os.path.join(root, file)
                if 'test_report' not in screenshot_file:
                    screenshot_name = os.path.splitext(os.path.basename(screenshot_file))[0]
                    screenshot_time = datetime.strptime(screenshot_name.split('_')[-2], '%Y-%m-%d')
                    screenshot_url = os.path.join(get_base_url(), screenshot_file)
                    content = content.replace('{}"'.format(screenshot_name), '{}" width="50%"'.format(screenshot_url))
        f.seek(0)
        f.write(content)

  8.pycharm运行run.py文件即 。

  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值