以下列出了在進行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