import logging import time from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support.ui import Select from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains as AC from Common import dir_config from Common import logger ''' 需要引入logger,才能使用自己定義好的日志 封裝操作頁面時候用的常用操作 ''' class BasePage: def __init__(self, driver): # 必須外部傳入driver 同一個driver經歷多個頁面 self.driver = driver # 等待元素可見 def wait_eleVisible(self, loc, timeout=20, poll_frequency=0.5, model=None): ''' :param loc: 元素定位表達式。元素類型,表達方式(元素定位類型,元素定位方法) :param timeout: 等待超時時間上限 :param poll_frequency: 輪詢周期 :param model:等待失敗時,截圖操作,圖片文件中需要顯示的功能模塊標注 :return: None ''' logging.info("{1}:等待元素可見:{0}".format(loc, model)) try: start = time.time() WebDriverWait(self.driver, timeout, poll_frequency).until(EC.visibility_of_element_located(loc)) end = time.time() logging.info("等待時長{0}:以秒為單位".format(round(end - start, 2))) except: logging.error("等待元素可見失敗。") # 截圖 self.save_webImgs(model) raise # 查找一個元素 def get_Element(self, loc, model=None): logging.info("{1}:查找元素:{0}".format(loc, model)) try: return self.driver.find_element(*loc) except: logging.error("查找元素失敗。") # 截圖 self.save_webImgs(model) raise # 輸入操作 def input_text(self, loc, text, model=None): # 查找元素 ele = self.get_Element(loc, model) # 輸入元素 logging.info("{0}:在元素{1}中輸入文本:{2}".format(model, loc, text)) try: ele.clear() ele.send_keys(text) except: logging.error("輸入操作失敗。") self.save_webImgs(model) raise # 點擊操作 def click_element(self, loc, model=None): # 找元素再點擊 ele = self.get_Element(loc, model) # 點擊操作 logging.info("{0}:元素:{1}點擊事件".format(model, loc)) try: ele.click() except: logging.error("元素:{0}點擊事件失敗".format(loc)) self.save_webImgs(model) raise # finally: # ele.click # logging.info("{0}:元素:{1}第二次點擊事件".format(model, loc)) # 鼠標懸浮 def hover_element(self, loc, model=None): # 查找元素 ele = self.get_Element(loc, model) logging.info("{0}:元素:{1}鼠標懸停事件".format(model, loc)) try: AC(self.driver).move_to_element(ele).perform() logging.info("{0}:元素:{1}鼠標懸停成功".format(model, loc)) except: logging.error("鼠標懸停操作失敗。") self.save_webImgs(model) raise # 雙擊操作 def double_click_element(self, loc, model=None): ele = self.get_Element(loc, model) try: AC(self.driver).double_click(ele).perform() logging.info("{0}:元素:{1}鼠標雙擊成功".format(model, loc)) except: logging.error("鼠標雙擊操作失敗。") self.save_webImgs(model) raise # 右鍵點擊 def context_click_element(self, loc, model=None): # 找元素再點擊 ele = self.get_Element(loc, model) try: AC(self.driver).context_click(ele).perform() logging.info("{0}:元素:{1}鼠標右鍵點擊成功".format(model, loc)) except: logging.error("鼠標右鍵點擊:{0}:元素:{1}操作失敗。".format(model, loc)) self.save_webImgs(model) raise # 鼠標拖拽 def drag_and_drop(self, loc1, loc2): AC(self.driver).drag_and_drop(loc1, loc2) # 清除操作 def clear_input_text(self, loc, model=None): # 找元素再清除 ele = self.get_Element(loc, model) logging.info("{0}:清除元素:{1}".format(model, loc)) try: ele.clear() except: logging.error("清除失敗") self.save_webImgs(model) raise # 獲取文本內容 def get_text(self, loc, model=None): # 找到元素 self.wait_eleVisible(loc) ele = self.get_Element(loc, model) # 獲取元素的文本內容 logging.info("{0}:獲取元素:{1}的文本內容".format(model, loc)) try: text = ele.text logging.info("{0}:元素:{1}的文本內容為:{2}".format(model, loc, text)) return text except: # 捕獲異常到日志 logging.error("獲取元素:{0}的文本內容失敗。".format(loc)) # 截圖 self.save_webImgs(model) # 拋出異常 raise # 獲取元素屬性 def get_element_attribuute(self, loc, attr_name, model=None): # 找到元素 ele = self.get_Element(loc, model) # 獲取元素屬性 logging.info("{0}:獲取元素:{1}的屬性:{2}".format(model, loc, attr_name)) try: value = ele.get_attribute(attr_name) logging.info("{0}:元素:{1}的屬性:{2}值為:{3}".format(model, loc, attr_name, value)) return value except: logging.error("獲取元素:{0}的屬性:{1}失敗,異常信息".format(loc, attr_name)) self.save_webImgs(model) raise # 截圖 def save_webImgs(self, model= None): # filepath=制定的圖片保存目錄/model(頁面功能名稱)_當前時間到秒.png filepath = dir_config.screenshot_dir + \ "/{0}_{1}.png".format(model, time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())) try: self.driver.save_screenshot(filepath) logging.info("截屏成功,圖片路徑為{0}".format(filepath)) except: logging.error("截屏失敗") # iframe切換 def switch_iframe(self, frame_refer, timeout=30, poll_frequency=0.5, model=None): # 等待iframe存在 logging.info("iframe切換操作:") try: WebDriverWait(self.driver, timeout, poll_frequency).until( EC.frame_to_be_available_and_switch_to_it(frame_refer)) time.sleep(0.5) logging.info("切換成功") except: logging.error("iframe切換失敗!") self.save_webImgs(model) raise # 切換回初始還沒有完善 # self.driver.switch_to_default_content() # 切換==index、name\id\WebElement # alert切換 def switch_alert(self, timeout=30, poll_frequency=0.5, model=None): ''' 正常獲取到彈出窗的text內容就返回alert這個對象(注意這里不是返回Ture),沒有獲取到就返回False :param timeout: :param poll_frequency: :param model: :return: ''' try: result = EC.alert_is_present()(self.driver) if result: msg = result.text logging.info("alert出現,內容為:{0}".format(msg)) result.accept() logging.info("alert已經關閉") return msg else: logging.info("未彈出alert") except: logging.error("alert切換失敗!") self.save_webImgs(model) raise # 獲取窗口句柄 def current_handles(self): current_handles = self.driver.window_handles return current_handles # 窗口切換==如果是切換到新窗口,new,如果是回到默認窗口,default。切換前,在新窗口打開前獲取handles def switch_window(self, name, current_handles=None, timeout=30, poll_frequency=0.5, model=None): ''' :param name: new代表最新打開的一個窗口。default代表第一個窗口。其他的值表示為窗口的handles :param current_handles: :param timeout: :param poll_frequency: :param model: :return: ''' try: if name == "new" and current_handles is not None: logging.info("切換到最新打開的窗口") WebDriverWait(self.driver, timeout, poll_frequency).until(EC.new_window_is_opened(current_handles)) window_handles = self.driver.window_handles # 獲取所有窗口句柄 self.driver.switch_to.window(window_handles[-1]) elif name == "default": logging.info("切換到第一個窗口") window_handles = self.driver.window_handles self.driver.switch_to.window(window_handles[0]) # self.driver.switch_to_default_content() else: logging.info("切換到指定handles") self.driver.switch_to.window(name) except: logging.error("切換失敗") self.save_webImgs(model) raise # select操作 def select(self, loc): # 等待Select出現 self.wait_eleVisible(loc) # 找到select元素 select_ele = self.get_Element(loc) # 初始化select類 s = Select(select_ele) return s # # 1、下標 # s.select_by_index() # # 2、value屬性 # s.select_by_value() # # 3、文本內容 # s.select_by_visible_text()
測試用例的日志如圖