pythonUI自动化之selenium常用方法封装


 以下列出了在进行UI自动化测试时, 常用的方法封装,装饰器是一个报错重试装饰器

 

报错重试装饰器

"""
名称:功能报错装饰器
功能:执行某个函数时,时常会因”网速慢、网络波动大、浏览器卡顿“等原因从而报错,其实这时重新执行可以解决问题,该装饰器就依次为功能。
如果执行某个函数报错,它就是重新执行,直至执行成功或超出时间就会跳出循环,无需再用例步骤前后追加强制等待时间,减少用例冗余。
返回:无
"""
from time import time, sleep


def func_error(func):
    def wrapper(*args, **kwargs):
        start_time = time()
        while True:
            sleep(0.3)
            try:
                func(*args, **kwargs)
            except:
                print(f"(错误装饰器)运行错误")
            else:
                break
            if time() - start_time >= 30:
                print(f"您已超出{int(time() - start_time)}秒,退出循环")
                break

    return wrapper

 

常用方法的二次封装

# 文件说明:selenium关键字驱动类:用例将所有常规操作进行封装
import os
import re
import time
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys, ActionChains
from UI.Common.Error_Decorator import func_error


class Key:

    def __init__(self):
        chrome_options = webdriver.ChromeOptions()
        # 自定义路径以及配置其它参数
        path = r"UI/TestTheDownloadedFile"
        prefs = {
            'profile.default_content_settings.popups': 0,  # 防止保存弹窗
            'download.default_directory': path,  # 设置默认下载路径,如果目录不存在则直接创建
            "profile.default_content_setting_values.automatic_downloads": 1  # 允许多文件下载
        }
        # 将自定义设置添加到chrome配置对象实例中
        chrome_options.add_experimental_option("prefs", prefs)
        # 启动带有自定义设置的chrome浏览器
        self.driver = webdriver.Chrome(options=chrome_options)

    # 浏览器操作------------------------------------------------------------------
    def open(self, txt):
        """
        访问url、最大化窗口、隐式等待
        :param txt: 网址
        """
        # 打开网址
        self.driver.get(txt)
        # 最大化浏览器窗口
        self.driver.maximize_window()
        # 隐式等待10秒
        self.driver.implicitly_wait(10)

    def quit(self):
        """
        退出浏览器
        """
        self.driver.quit()

    @func_error
    def open_new_bookmark(self, txt):
        """
        一个浏览器打开多个页签
        :param txt: 网址
        """
        js = f"window.open('{txt}')"
        self.driver.execute_script(js)
        self.driver.switch_to.window(self.driver.window_handles[-1])

    @func_error
    def switch(self, txt):
        """
        跳转到新页签
        :param txt: txt传入的是数字, 传入0代表切换原始页签,输入1或N是切换新页签,从左往右数
        """
        self.driver.implicitly_wait(2)
        self.driver.switch_to.window(self.driver.window_handles[txt])

    @func_error
    def window_switch(self):
        """
        关闭当前窗口
        """
        self.driver.switch_to.window(self.driver.window_handles[1])  # 切换到新页签
        self.driver.close()  # 关闭新页签
        self.driver.switch_to.window(self.driver.window_handles[0])  # 然后切换回原始页签

    @func_error
    def switch_new_iframe(self, value, name="xpath"):
        """
        iframe窗口切换
        :param value: 元素路径
        :param name: 定位方法,默认为xpath
        """
        iframe = self.driver.find_element(name, value)  # 定位iframe框架
        self.driver.switch_to.frame(iframe)  # 切换到iframe框架

    @func_error
    def quit_old_iframe(self):
        """
        退出iframe
        """
        self.driver.switch_to.default_content()

    def sleep(self, txt):
        """
        强制等待
        :param txt: 传入时间,单位为秒
        :return:
        """
        sleep(txt)

    def browser_zoom(self, txt):
        """
        浏览器缩放,0.5为缩放50%,0.25为缩放0.25
        :param txt: 缩放值:0.5
        """
        self.driver.execute_script(f"document.body.style.zoom='{txt}'")

    # 元素操作函数-----------------------------------------------------------------
    @func_error
    def locator(self, value, name="xpath"):
        """
        元素定位(可用作元素等待)
        :param value: 元素路径
        :param name: 定位方法,默认为xpath
        :return:
        """
        return self.driver.find_element(name, value)

    def input(self, txt, value, name="xpath"):
        """
        输入:对某元素输入内容
        :param txt: 输入的内容
        :param value: 元素路径
        :param name: 元素定位方法
        """
        el = self.driver.find_element(name, value)
        el.clear()
        el.send_keys(txt)

    def input_enter(self, txt, value, name="xpath"):
        """
        对某元素输入内容,并敲回车
        :param txt: 输入的内容
        :param value: 元素路径
        :param name: 定位方法
        """
        el = self.driver.find_element(name, value)
        el.clear()  # 清空输入框
        el.send_keys(txt)  # 输入内容
        sleep(0.5)
        el.send_keys(Keys.ENTER)

    @func_error
    def click(self, value, name="xpath"):
        """
        点击元素
        :param value: 元素路径
        :param name: 元素定位方法
        """
        el = self.driver.find_element(name, value)
        # 高亮操作元素
        # self.driver.execute_script(
        #     "arguments[0].setAttribute('style', arguments[1]);",
        #     el,
        #     "border: 2px solid red;"  # 边框border:2px; red红色
        # )
        el.click()

    @func_error
    def click_pluas(self, value, name="xpath"):
        """
        元素点击被拦截错误处理
        :param value: 元素路径
        :param name: 元素定位方法
        """
        el = self.driver.find_element(name, value)
        self.driver.execute_script("arguments[0].click();", el)

    def enter(self, value, name="xpath"):
        """
        对某元素的输入框敲“回车键”
        :param value: 元素路径
        :param name: 定位方法
        """
        self.driver.find_element(name, value).send_keys(Keys.ENTER)

    def get_ele_txt(self, value, name="xpath"):
        """
        获取元素文本
        :param value: 元素路径
        :param name: 定位方法
        :return: 返回元素文本信息
        """
        # el = self.driver.find_element(name, value)
        # self.driver.execute_script("arguments[0].scrollIntoView(false)", el)
        # self.driver.execute_script("arguments[0].scrollIntoView(true)", el)
        # return el.text

        start_time = time.time()
        el = self.driver.find_element(name, value)
        while True:
            if el.text != "":
                return el.text
            elif time.time() - start_time >= 10:
                return f"超时{time.time() - start_time}秒,元素文本为None,请检查元素定位"
            else:
                # "driver.execute_script"将元素移动到可视界面
                self.driver.execute_script("arguments[0].scrollIntoView(false)", el)
                self.driver.execute_script("arguments[0].scrollIntoView(true)", el)
                continue

    def get_element_attribute(self, txt, value, name="xpath"):
        """
        获取元素属性值,举例:driver.find_element('xpath','//input[@id="kw"]').get_attribute('id')。id可以是任何属性名
        :param txt: 元素的属性名称
        :param value: 元素路径
        :param name: 定位方法
        :return: 返回元素属性值
        """
        el_key = self.driver.find_element(name, value).get_attribute(txt)
        return el_key

    # 鼠标键盘操作--------------------------------------------------------------------
    def mouse_move(self, value, name="xpath"):
        """
        将鼠标移动到某元素上
        :param value: 元素路径
        :param name: 定位方法
        """
        element = self.driver.find_element(name, value)
        ActionChains(self.driver).move_to_element(element).perform()

    def mouse_press_move(self, xoffset, yoffset, value, name="xpath"):
        """
        按住鼠标滑动
        :param xoffset: 横坐标
        :param yoffset: 纵坐标
        :param value: 元素路径
        :param name: 定位方法
        """
        element = self.driver.find_element(name, value)
        ActionChains(self.driver).drag_and_drop_by_offset(element, xoffset, yoffset).perform()

    # 文件操作----------------------------------------------------------------------
    def listdir_file(self, path):
        """
        读取某目录下所有文件
        :param path: 文件所在目录
        :return: 将以文件名称放入列表返回
        """
        return os.listdir(path)

    @func_error
    def remove_file(self, path):
        """
        删除某目录下所有文件
        :param path: 需要删除的目录
        :return: 删除成功返回True,删除失败返回False
        """
        for i in os.listdir(path):
            os.remove(fr'{path}/{i}')
        file = os.listdir(path)
        if file == [] or None:
            return True
        elif file != [] or None:
            return False

    # 其它---------------------------------------------------------------------------
    def regular_expression(self, pattern, string):
        """
        正则表达式。pattern:匹配的正则表达式 ; string:要匹配的字符串;
        :param pattern: 匹配的正则表达式
        :param string: 要匹配的字符串
        :return: 成功返回True、错误返回False
        """
        if re.match(pattern, string) is not None:
            return True
        elif re.match(pattern, string) is None:
            return False

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM