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

UI自动化常见方法封装

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



class Key:

    def __init__(self,headless_mode):
        """
        :param headless_mode: 是否开启无头, True开启, False关闭
        """
        # 创建一个DesiredCapabilities对象,用于指定Chrome浏览器的配置
        d = DesiredCapabilities.CHROME
        d['goog:loggingPrefs'] = {'performance': 'ALL'}  # 指定浏览器记录所有性能日志

        # 创建一个ChromeOptions对象,用于指定Chrome浏览器的启动选项
        chrome_options = Options()
        # 是否开启无头, True开启, False关闭
        chrome_options.headless = headless_mode

        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()

    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])

    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])

    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])  # 然后切换回原始页签

    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框架

    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}'")

    # 获取浏览器接口
    def get_url(self, url):
        """
        :param url: 需要获取的接口url
        :return:
        """
        # 获取浏览器的性能日志,并将其保存为一个列表。'performance'参数表示获取性能日志。
        logs_list = self.driver.get_log('performance')
        # 循环日志列表
        for i in logs_list:
            # 如果日志中包含该接口, 则返回该行日志内容
            if url in i['message']:
                return i['message']


    # 元素操作函数-----------------------------------------------------------------
    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)

    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()

    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)

    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好度

你的鼓励是我最大的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值