web自动化:针对PO模式,对basepage进行二次封装

即对selenium webdriver API基本操作的二次封装

目的:简化代码,提供框架该有的东西
每一个函数 -提供了一个功能 - 公共的功能
有了basepage,在PageObjects当中直接调用元素操作,不用考虑等待/查找。

无pagebase,PageObjects当中,重复调用了等待/查找/操作

日志/失败 截图 – 进行处理
1.等待可见
2.查找元素
3.点击 - 前提:等待和查找
4.输入 - 前提:等待和查找
5.获取属性 - 前提:等待和查找
6.获取文本 - 前提:等待和查找

from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from Conmon.logger_handler import logger
from Conmon.dir_config import screenshot_path
import time


# 记录日志/失败截图+错误信息输出+抛出异常
class BasePage:
    # BasePage类,针对PageObjects类的二次封装
    def __init__(self, driver: WebDriver):
        self.driver = driver
        
    # 1.等待元素可见
    def wait_ele_visible(self, loc, img_name, timeout=20, poll_fre=0.5):
        """
        :param loc: 元素定位
        :param img_name: {页面名称_页面行为}
        :param timeout: 最长超时时间,默认以秒为单位
        :param poll_fre: 检测的间隔步长,默认为0.5s
        :return:
        查找元素用了多久?
        等待开始的时候,记录一下当前的时间,等等待结束后,再记录一次,然后计算时间差
        """
        logger.info("在{} 等待 {} 元素可见。".format(img_name, loc))
        # 等待开始的时候,记录一下当前的时间
        start_time = time.time()
        try:
            WebDriverWait(self.driver, timeout, poll_frequency=poll_fre).until(EC.visibility_of_element_located(loc))
        except:
            # 失败截图写入日志
            self.save_page_shot(img_name)
            logger.exception("等待元素可见失效!")  # 异常信息写入日志当中
            raise
        else:
            # 等待结束后,再记录一次,然后计算时间差
            end_time = time.time()
            dif_time = int(end_time) - int(start_time)
            logger.info("在{} 等待 {} 元素时间 {}".format(img_name, loc, dif_time))

    # 2.查找元素
    def get_element(self, loc, img_name):
        logger.info("在{} 查找元素 {}。".format(img_name, loc))
        try:
            ele = self.driver.find_element(*loc)
        except:
            self.save_page_shot(img_name)
            logger.exception("查找元素失败!")  # 异常信息写入日志当中
            raise
        else:  # 查找成功返回ele对象
            return ele

    # 查找所有的元素
    def get_elements(self, loc, img_name):
        logger.info("在{} 查找所有元素 {}。".format(img_name, loc))
        try:
            eles = self.driver.find_elements(*loc)
        except:
            self.save_page_shot(img_name)
            logger.exception("查找所有元素失败!")  # 异常信息写入日志当中
            raise
        else:  # 查找成功返回ele对象
            return eles

    # 3.点击 # 需要元素可见
    def click_element(self, loc, img_name, timeout=20, poll_fre=0.5):
        self.wait_ele_visible(loc, img_name, timeout, poll_fre)
        ele = self.get_element(loc, img_name)
        logger.info("在 {} 点击 {} 元素。".format(img_name, loc))
        try:
            ele.click()
        except:
            self.save_page_shot(img_name)
            logger.exception("点击元素失败!")  # 异常信息写入日志当中
            raise

    # 4.文本输入
    def input_text(self, loc, value, img_name, timeout=20, poll_fre=0.5):
        self.wait_ele_visible(loc, img_name, timeout, poll_fre)
        ele = self.get_element(loc, img_name)
        logger.info("在 {} 往 {} 元素中输入文本值 {}。".format(img_name, loc, value))
        try:
            ele.send_keys(value)
        except:
            self.save_page_shot(img_name)
            logger.exception("文本输入元素失败!")  # 异常信息写入日志当中
            raise

    # 5.获取属性  - 不一定要可见 - 没有绝对的答案
    def get_ele_attribute(self, loc, attr_name, img_name, timeout=20, poll_fre=0.5):
        self.wait_ele_visible(loc, img_name, timeout, poll_fre)
        ele = self.get_element(loc, img_name)
        logger.info("在 {} 获取 {} 元素的 {} 属性。".format(img_name, loc, attr_name))
        try:
            value = ele.get_attribute(attr_name)
        except:
            self.save_page_shot(img_name)
            logger.exception("获取元素属性值失败!")  # 异常信息写入日志当中
            raise
        else:
            logger.info("属性值为:{}".format(value))
            return value

    # 6.元素存在
    # def wait_page_element_exist(self):
    #     pass

    # 7.获取元素文本值
    def get_ele_text(self, loc, img_name, timeout=20, poll_fre=0.5):
        self.wait_ele_visible(loc, img_name, timeout, poll_fre)
        ele = self.get_element(loc, img_name)
        logger.info("在 {} 获取 {} 元素的文本值。".format(img_name, loc))
        try:
            text = ele.text
        except:
            self.save_page_shot(img_name)
            logger.exception("获取元素属性值失败!")  # 异常信息写入日志当中
            raise
        else:
            logger.info("文本值为:{}".format(text))
            return text

    # 保存截图
    def save_page_shot(self, img_name):
        """
        :param img_name:{页面名称_页面行为}
        :return:
        """
        # 图片存储到Outpus的screenshots 下,唯一不同的是,图片命名
        # 命名规范:{页面名称_页面行为}_时间.png
        # 文件完整名称 = Outputs的screenshot + {页面名称_页面行为}_时间.png
        now_time = time.strftime("%Y-%m-%d %H-%M-%S")
        # file_name = "{}_{}.png".format(img_name, now_time)
        screenshots_path = screenshot_path + "/{}_{}.png".format(img_name, now_time)
        self.driver.save_screenshot(screenshots_path)
        logger.info("截取当前页面成功并存储在:{}".format(screenshots_path))


if __name__ == '__main__':
    # import time
    # now = time.strftime("%Y-%m-%d %H:%M:%S")
    # print(now)
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get("https://www.baidu.com")
    # 调basepage类里面的页面操作行为,实例化
    bp = BasePage(driver)
    search_loc = ("id", "kw")
    bp.input_text(search_loc, "basepage二次封装", "百度页面_搜索输入操作")

问题1:
保存截图需要注意的是:文件名字不能有冒号

你可能感兴趣的:(web自动化)