selenium之BasePage封裝


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

 

 

測試用例的日志如圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM