史上最強大的selenium webdriver的封裝
阿新 • • 發佈:2018-06-25
用例 ID *args 元素 http utf 添加 ram nbsp
放出這個類,用法見測試用例。
1、基於selenium的二次封裝,整體代碼非常短易於理解,帶有兩個自定義方法示例供參考,易於擴展。 2、支持無限實例化此類,仍然保持使用同一個瀏覽器窗口。 3、支持使用自定義的方法名字,同時全所未有的支持了直接性的使用所有此類中沒有定義的方法,但在官方類中有的api方法,比如直接支持DriverWrapper().execute_script(script, *args)這種寫法。 4、其余想自定義名稱的方法可以在這個類下面接著寫或者繼承這個類再添加其他更多方法
5、支持了一個控制臺日誌,精確 到文件的名字 類名 是在哪一行打印的日誌。
經過測試,支持python2和3,支持chrom和firefox,需要安裝selenium包和瀏覽器驅動放到有環境變量的文件夾下。然後就能運行了。
# coding:utf-8 import logging import unittest from selenium import webdriver class cached_class_property(object): def __init__(self, func): self.func = func def __get__(self, obj, cls): if obj is None: return self value = self.func(obj) setattr(cls, self.func.__name__, value) return value class DriverWrapper(): """ 1、基於selenium的二次封裝, 2、支持無限實例化此類,仍然保持使用同一個瀏覽器窗口。 3、支持使用自定義的方法名字,同時直接性的支持使用所有此類中沒有定義的方法,但在官方類中有的api方法,比如直接支持DriverWrapper().execute_script(script, *args)這種寫法。 4、其余想自定義名稱的方法可以在這個類下面接著寫或者繼承這個類再添加其他更多方法 """def __init__(self, driver_name): """ :param driver_name: 瀏覽器名字數字或者字母 """ self.driver_name = driver_name @cached_class_property def driver(self): driver_var = None if self.driver_name in [‘chrome‘, 1]: driver_var = webdriver.Chrome() if self.driver_name in [‘firefox‘, 2]: driver_var = webdriver.Chrome() return driver_var @cached_class_property def logger(self): logger_var = logging.getLogger(self.__class__.__name__) logger_var.setLevel(logging.DEBUG) stream_handler = logging.StreamHandler() stream_handler.setFormatter(logging.Formatter(‘%(asctime)s - %(name)s - %(filename)s - %(lineno)d - %(levelname)s - %(message)s‘, "%Y-%m-%d %H:%M:%S")) logger_var.addHandler(stream_handler) return logger_var def open(self, url): self.driver.get(url) def find_element_by_css_selector(self, css_str): # 使用自定義的方法覆蓋了原方法,比如先打印出一段話 self.logger.debug(‘要查找的元素的css選擇器是 --> ‘ + css_str) self.driver.find_element_by_css_selector(css_str) def __getattr__(self, item): # 想把其他的webdriver的操作方法直接添加進來,不一個一個的再寫一個方法然後調用driver屬性的方法,不想一直搞冗余的代碼,可以這麽做。python先使用__getattribute__,查不到才會調用__getsttr__方法,利用這個特性,來實現這個添加driver的屬性到自己類裏面 return getattr(self.driver, item) class _Test(unittest.TestCase): def test(self): driver_wrapper = DriverWrapper(1) driver_wrapper.open(‘https://www.baidu.com‘) # 有人不喜歡用get,可以叫open什麽的 driver_wrapper.find_element_by_css_selector(‘#kw‘) # 當類中存在方法,優先使用了自己類裏面的方法,所以每次使用css選擇器查找元素時候會打印一個日誌 driver_wrapper.find_element_by_id(‘kw‘) # 當類中不存在此方法,使用Chrome類的方法 driver_wrapper2 = DriverWrapper(1) # 重新實例化一次這個類,仍然可以接著使用之前的瀏覽器,不會重新彈一個瀏覽器窗口 driver_wrapper2.open(‘https://www.sina.com‘)
driver_wrapper.logger.info(‘運行完了,現在想關閉瀏覽器‘) driver_wrapper2.driver.close() # 這樣做也可以,但不算是動態添加屬性了,這是直接使用的該實例的driver屬性的方法,driver屬性是Chrome的一個實例。 if __name__ == ‘__main__‘: unittest.main()
史上最強大的selenium webdriver的封裝