# -*- coding: utf-8 -*- # @Time : 2021年02月07日 13時58分 # @Email : Gamest@foxmail.com # @Author : BeiLe # @File : base_class.py # @notice : from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions from Common.path_os import record_dir from Common.log import Log import time import win32gui import win32con log = Log() class Base: # 引入驅動 def __init__(self, drivers): self.driver = drivers # 截圖 def record(self, model_name="error"): RecordPath = record_dir + "/{}_{}.png".format(model_name, time.strftime("%Y-%m-%d-""%H-%M-%S", time.localtime())) try: self.driver.get_screenshot_as_file(RecordPath) except Exception as e: log.error("截圖失敗:{}".format(e)) # 等待元素 - 默認等待30秒,每0.5秒找一次 def wait_elevisible(self, locator, timeout=30, poll_frequency=0.5, model_name="model"): try: WebDriverWait(self.driver, timeout, poll_frequency).until( expected_conditions.visibility_of_element_located(locator)) except Exception as e: self.record(model_name) log.error("等待超時,未找到元素:{}".format(e)) # 查找元素 def get_element(self, locator, model_name="model"): try: return self.driver.find_element(*locator) except Exception as e: self.record(model_name) log.error("未找到元素:{}".format(e)) # 點擊元素 def click_elemet(self, locator, model_name="model"): ele = self.get_element(locator, model_name) try: ele.click() except Exception as e: self.record(model_name) log.error("點擊元素失敗:{}".format(e)) # 輸入框 - 輸入內容 def input_text(self, locator, value, model_name="model"): ele = self.get_element(locator, model_name) try: ele.send_keys(value) except Exception as e: self.record(model_name) log.error("輸入內容失敗:{}".format(e)) # 輸入框 - 清空內容 def clear_text(self, locator, model_name="model"): ele = self.get_element(locator, model_name) try: ele.clear() except Exception as e: self.record(model_name) log.error("清空輸入框內容失敗:{}".format(e)) # 獲取元素的文本內容 def get_text(self, locator, model_name="model"): ele = self.get_element(locator, model_name) try: return ele.text except Exception as e: self.record(model_name) log.error("獲取元素文本內容失敗:{}".format(e)) # 獲取元素屬性 def get_ele_attribute(self, locator, attribute, model_name="model"): ele = self.get_element(locator, model_name) try: return ele.get_attribute(attribute) except Exception as e: self.record(model_name) log.error("獲取元素屬性失敗:{}".format(e)) # 元素存在則為True,否則為False def is_eleExist(self, locator, model_name="model"): try: self.wait_elevisible(locator, model_name=model_name) return True except Exception as e: self.record(model_name) log.error("元素不存在:{}".format(e)) return False # 切換alert彈框 def switch_to_alert(self, action="accept", content="請輸入內容", model_name="model"): try: WebDriverWait(self.driver, timeout=30, poll_frequency=0.5).until(expected_conditions.alert_is_present()) # 切換到alert alert = self.driver.switch_to.alert # 確定按鈕 if action == "accept": alert.accept() # 輸入框 elif action == "value": alert.send_keys(content) # 取消按鈕 else: alert.dismiss() except Exception as e: self.record(model_name) log.error("alert操作失敗:{}".format(e)) # windows窗口切換 def switch_window(self, str_wd="", index=None, model_name="mode1"): try: time.sleep(2) # 獲取所有窗口 windows = self.driver.window_handles if str_wd == "new": self.driver.switch_to.window(windows[-1]) else: if index is not None and 0 <= int(index) < len(windows): self.driver.switch_to.window(windows[int(index)]) except Exception as e: self.record(model_name) log.error("切換瀏覽器窗口失敗:{}".format(e)) # iframe切換 def switch_to_iframe(self, locator, model_name="mode1"): try: # 切過去 ele = self.get_element(locator) WebDriverWait(self.driver, timeout=30, poll_frequency=0.5).until( expected_conditions.frame_to_be_available_and_switch_to_it(ele)) # 執行命令后切回來 self.driver.switch_to.default_content() except Exception as e: self.record(model_name) log.error("切換iframe失敗:{}".format(e)) # 上傳文件 每個系統不一樣,一般是這種 def upload(self, file, browser_type="chrome", model_name="mode1"): try: if browser_type == "chrome": title = "打開" else: title = "" # 一級窗口 dialog = win32gui.FindWindow("#32770", title) # 二級窗口 ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None) comboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, "ComboBox", None) # 三級窗口 - 輸入框 edit = win32gui.FindWindowEx(comboBox, 0, 'Edit', None) # 四級窗口 - 打開按鈕 open_button = win32gui.FindWindowEx(dialog, 0, 'Button', "打開(&O)") # 輸入文件路徑 win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, file) # 上傳 win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, open_button) except Exception as e: self.record(model_name) log.error("上傳文件失敗:{}".format(e)) # 滾動條操作 def move_to_see(self, locator, type_ele="will", model_name="mode1"): try: if type_ele == "will": self.driver.execute_script("arguments[0].scrollIntoView();", locator) time.sleep(2) elif type_ele == "top": self.driver.execute_script("window.scrollTo(0,0)") time.sleep(2) else: self.driver.execute_script("var q=document.documentElement.scrollTop=10000") time.sleep(2) except Exception as e: self.record(model_name) log.error("滾動條操作失敗:{}".format(e))