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