史上最强大的python selenium webdriver的包装

Posted jason89

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了史上最强大的python selenium webdriver的包装相关的知识,希望对你有一定的参考价值。


 1、基于selenium的二次包装,整体代码非常短易于理解,带有两个自定义方法示例供参考,易于扩展。
 2、支持无限实例化此类,只要曾经弹出了浏览器,在任何跨函数 跨类 跨python文件中再次实例化此类,绝对不会弹第二个浏览器。所有地方无论怎么写,仍然保持使用同一个浏览器窗口。(当然指的是单次运行python文件,如果自己反复的关闭和启动python,那肯定是不能使用已打开的浏览器的)
 3、支持使用自定义的方法名字,同时全所未有的支持了直接性的使用所有此类中没有定义的方法,但在官方类中有的api方法,比如直接支持DriverWrapper().execute_script(script, *args)这种写法。
 4、其余想自定义名称的方法可以在这个类下面接着写或者继承这个类再添加其他更多方法
 5、支持了一个控制台日志,精确 到文件的名字 类名 是在哪一行打印的日志。

经过测试,支持python2和3,支持chrom和firefox,需要安装selenium包和浏览器驱动放到有环境变量的文件夹下。然后就能运行了。

 


1
# coding:utf-8 2 3 import logging 4 import unittest 5 from selenium import webdriver 6 7 8 class cached_class_property(object): 9 def __init__(self, func): 10 self.func = func 11 12 def __get__(self, obj, cls): 13 if obj is None: 14 return self 15 value = self.func(obj) 16 setattr(cls, self.func.__name__, value) 17 return value 18 19 20 class DriverWrapper(): 21 """ 22 1、基于selenium的二次封装, 23 2、支持无限实例化此类,仍然保持使用同一个浏览器窗口。 24 3、支持使用自定义的方法名字,同时直接性的支持使用所有此类中没有定义的方法,但在官方类中有的api方法,比如直接支持DriverWrapper().execute_script(script, *args)这种写法。 25 4、其余想自定义名称的方法可以在这个类下面接着写或者继承这个类再添加其他更多方法 26 """ 27 28 def __init__(self, driver_name): 29 """ 30 :param driver_name: 浏览器名字数字或者字母 31 """ 32 self.driver_name = driver_name 33 34 @cached_class_property 35 def driver(self): 36 driver_var = None 37 if self.driver_name in [chrome, 1]: 38 driver_var = webdriver.Chrome() 39 if self.driver_name in [firefox, 2]: 40 driver_var = webdriver.Chrome() 41 return driver_var 42 43 @cached_class_property 44 def logger(self): 45 logger_var = logging.getLogger(self.__class__.__name__) 46 logger_var.setLevel(logging.DEBUG) 47 stream_handler = logging.StreamHandler() 48 stream_handler.setFormatter(logging.Formatter(%(asctime)s - %(name)s - %(filename)s - %(lineno)d - %(levelname)s - %(message)s, "%Y-%m-%d %H:%M:%S")) 49 logger_var.addHandler(stream_handler) 50 return logger_var 51 52 def open(self, url): 53 self.driver.get(url) 54 55 def find_element_by_css_selector(self, css_str): # 使用自定义的方法覆盖了原方法,比如先打印出一段话 56 self.logger.debug(要查找的元素的css选择器是 --> + css_str) 57 self.driver.find_element_by_css_selector(css_str) 58 59 def __getattr__(self, item): # 想把其他的webdriver的操作方法直接添加进来,不一个一个的再写一个方法然后调用driver属性的方法,不想一直搞冗余的代码,可以这么做。python先使用__getattribute__,查不到才会调用__getsttr__方法,利用这个特性,来实现这个添加driver的属性到自己类里面 60 return getattr(self.driver, item) 61 62 63 class _Test(unittest.TestCase): 64 def test(self): 65 driver_wrapper = DriverWrapper(1) 66 driver_wrapper.open(https://www.baidu.com) # 有人不喜欢用get,可以叫open什么的 67 driver_wrapper.find_element_by_css_selector(#kw) # 当类中存在方法,优先使用了自己类里面的方法,所以每次使用css选择器查找元素时候会打印一个日志 68 driver_wrapper.find_element_by_id(kw) # 当类中不存在此方法,使用Chrome类的方法 69 70 driver_wrapper2 = DriverWrapper(1) # 重新实例化一次这个类,仍然可以接着使用之前的浏览器,不会重新弹一个浏览器窗口 71 driver_wrapper2.get(https://www.sina.com) # 仍然可以使用get方法打开页面 driver_wrapper.logger.info(‘运行完了,现在想关闭浏览器‘) 72 driver_wrapper2.driver.close() # 这样做也可以,但不算是动态添加属性了,这是直接使用的该实例的driver属性的方法,driver属性是Chrome的一个实例。 73 74 75 if __name__ == __main__: 76 unittest.main()

 


以上是关于史上最强大的python selenium webdriver的包装的主要内容,如果未能解决你的问题,请参考以下文章

史上最强大的40多个纯CSS绘制的图形

史上最快最强大的Gradle 5.0发布,新特性全解

JRoll 2 使用文档(史上最强大的下拉刷新,滚动,无限加载插件)

哪里有截图识别翻译的软件?全网首发,史上最强大的电脑截图翻译软件!

震惊!!!史上最强 python 智能问答系统现世

史上最全最强SpringMVC详细示例实战教程