web自动化脚本中有一部分代码是可以借鉴的,我们只需要将这个框架移植到当前项目中,修改部分参数即可。比如日志类、driver对象、元素基本操作等。

以商城项目为例,以下就是相关代码。

base包(内含日志、driver对象、页面元素操作):

页面元素操作(base.py):

import time
from time import sleep

import page
from selenium.webdriver.support.wait import WebDriverWait
from base.get_logger import GetLogger


# 获取log日志器
log = GetLogger().get_logger()


class Base:

    def __init__(self, driver):
        log.info("[base]: 正在获取初始化driver对象:{}".format(driver))
        self.driver = driver

    # 查找元素方法 封装
    def base_find(self, loc,  timeout=30, poll=0.5):
        log.info("[base]: 正在定位:{} 元素,默认定位超时时间为: {}".format(loc, timeout))
        # 使用显示等待 查找元素
        return WebDriverWait(self.driver,
                             timeout=timeout,
                             poll_frequency=poll).until(lambda x:x.find_element(*loc))

    # 点击元素 方法封装
    def base_click(self, loc):
        log.info("[base]: 正在对:{} 元素实行点击事件".format(loc))
        self.base_find(loc).click()

    # 输入元素 方法封装
    def base_input(self, loc, value):
        # 获取元素
        el = self.base_find(loc)
        # 清空
        log.info("[base]: 正在对:{} 元素实行清空".format(loc))
        el.clear()
        # 输入
        el.send_keys(value)

    # 获取文本信息 方法封装
    def base_get_text(self, loc):
        log.info("[base]: 正在获取:{} 元素文本值".format(loc))
        return self.base_find(loc).text

    # 截图 方法封装
    def base_get_image(self):
        log.info("[base]: 断言出错,调用截图")
        self.driver.get_screenshot_as_file("../image/{}.png".format(time.strftime("%Y_%m_%d %H_%M_%S")))

    # 判断元素是否存在 方法封装
    def base_element_is_exist(self, loc):
        try:
            self.base_find(loc, timeout=2)
            log.info("[base]: {} 元素查找成功,存在页面".format(loc))
            return True # 代表元素存在
        except:
            log.info("[base]: {} 元素查找失败,不存在当前页面".format(loc))
            return False # 代表元素不存在

    # 回到首(页购物车、下订单、支付)都需要用到此方法
    def base_index(self):
        sleep(2)
        self.driver.get(page.URL)

    # 切换frame表单方法
    def base_switch_frame(self, name):
        self.driver.switch_to.frame(name)

    # 回到默认目录方法
    def base_default_content(self):
        self.driver.switch_to.default_content()

    # 切换窗口 方法 调用此方法
    def base_switch_to_window(self, title):
        log.info("正在执行切换title值为:{}窗口 ".format(title))
        self.driver.switch_to.window(self.base_get_title_handle(title))

    # 获取指定title页面的handle方法
    def base_get_title_handle(self, title):
        # 获取当前页面所有的handles
        for handle in self.driver.window_handles:
            log.info("正在遍历handles:{}-->{}".format(handle, self.driver.window_handles))
            # 切换 handle
            self.driver.switch_to.window(handle)
            log.info("切换 :{} 窗口".format(handle))
            # 获取当前页面title 并判断 是否等于 指定参数title
            log.info("判断当前页面title:{} 是否等于指定的title:{}".format(self.driver.title, title))
            if self.driver.title == title:
                log.info("条件成立! 返回当前handle{}".format(handle))
                # 返回 handle
                return handle

driver对象(get_driver.py):
from selenium import webdriver
import page


class GetDriver:
    driver = None

    # 获取 driver
    @classmethod
    def get_driver(cls):
        if cls.driver is None:
            # 获取driver
            cls.driver = webdriver.Firefox()
            # 最大化浏览器
            cls.driver.maximize_window()
            # 打开url
            cls.driver.get(page.URL)
        # 返回 driver
        return cls.driver

    # 关闭driver
    @classmethod
    def quit_driver(cls):
        if cls.driver:
            cls.driver.quit()
            # 必须置空操作
            cls.driver = None

if __name__ == '__main__':
    GetDriver().quit_driver()

日志对象(get_logger.py):
import logging.handlers


class GetLogger:

    logger = None
    # 在最外侧运行
    # filename = "./log/xxxx.log"
    # 获取 logger
    @classmethod
    def get_logger(cls):
        # 如果 logger为空
        if cls.logger is None:
            # 获取日志器
            cls.logger = logging.getLogger()
            # 设置日志器默认级别
            cls.logger.setLevel(logging.INFO)
            # 获取处理器 控制台
            sh = logging.StreamHandler()
            # 获取处理 文件(时间)
            th = logging.handlers.TimedRotatingFileHandler(filename="../log/xxxx.log",
                                                           when="midnight",
                                                           interval=1,
                                                           backupCount=30,
                                                           encoding="utf-8")
            # 获取格式器
            fm = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
            fmt = logging.Formatter(fm)
            # 将格式器 设置 处理器中
            sh.setFormatter(fmt)
            th.setFormatter(fmt)
            # 将处理器 添加到 日志器中
            cls.logger.addHandler(sh)
            cls.logger.addHandler(th)
        # 返回 日志器
        return cls.logger

定义测试套件(run_main.py直接放在项目目录下):
# 导包
import unittest
import time
from tool.HTMLTestRunner import HTMLTestRunner


# 定义测试套件 在scripts中 运行
# suite = unittest.defaultTestLoader.discover("./")
# 在最外侧运行
suite = unittest.defaultTestLoader.discover("./scripts")
# 报告生成目录及文件名称
dir_path = "./report/{}.html".format(time.strftime("%Y_%m_%d %H_%M_%S"))
# 获取文件流并调用run运行
with open(dir_path, "wb") as f:
    HTMLTestRunner(stream=f, title="Tpshop商城自动化测试报告", description="操作系统:win7").run(suite)

在工具包(tools)中存放HTMLTestRunner.py文件

以上就是Python语言web自动化脚本常用的代码,按需使用。