史上最强大的selenium webdriver的封装

放出这个类,用法见测试用例。

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

原文地址:https://www.cnblogs.com/ydf0509/p/9221969.html

时间: 2024-10-10 16:21:35

史上最强大的selenium webdriver的封装的相关文章

强烈推荐:Android史上最强大的自定义任务软件Tasker

强烈推荐:Android史上最强大的自定义任务软件Taskerhttp://bbs.mumayi.com/thread-28387-1-1.html(出处: 木蚂蚁手机乐园) Android上的Tasker绝对称得上是Android系统的神器之一,与Auto Memory Manager不同,Tasker不是加速型的软件,而是系统增强型的软件,由于有众多系统状态可控制,故使得Tasker一跃成为Android系统中最闪亮的明星.但Tasker也无疑是最难使用的软件,由于可以控制的地方太多,反而让

VC自绘 史上最强大且精简的记分点名软件

创意.诚意.潜力之作 史上最强大且精简的记分点名软件. 教育专家推荐的课堂软件,当老师的错过了,错过了肯定是您的损失. [一]个性开头白 唐诗.名言.英文.自定义 并可语音朗读出 [二]个性小组名 小组口号 并醒目显示 [三] 完善的积分机制 [四]  QQ管理界面 www.gudianxiaoshuo.com                

史上最强大的 Vim 代码补全引擎:YouCompleteMe

引言 自己之前Vim的代码补全插件都是使用 ctags + autotag + taglist + omnicppcompele 的组合,而且很多时候都没有提示或提示补全,而且每次打开一个新文件文件都需要创建一个 ctag 标签库,代码补全才能正能工作,十分的繁琐蛋疼.当时我就在想,既然源代码都有了,难道就没有一个 Vim 插件能的通过已有的源代码,实时构建语法书来提供代码补全提示吗?通过一番搜索,终于发现了她--YouCompleteMe,看了介绍,我开始迫不及待的试用了,顿时感觉从小米加步枪

成功率“99%”!截止目前史上最强大电信诈骗术

成功率“99%”!截止目前史上最强大电信诈骗术 本文转自:i春秋学院 这是截止目前看到的最强大诈骗手法,也是最有技术含量的诈骗术!比上次见到贿赂高官信封诈骗术不知道高到哪里去了!这骗术一般人最起码98%以上中标!诈骗技术含量实在太高太高!囡囡不得不把@越来越老的来来的经历分享给大家!  (注:大家请看这个短信的抬头,的确是95533,以下同,光就这步,估计很多人就要吓尿了)我们继续看:<ignore_js_op> (这位同学的防诈骗意识还是非常强大的,接下来就恐怖了) (认清电话来源是防止诈骗

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

概述 说明 JRoll,一款能滚起上万条数据,具有滑动加速.回弹.缩放.滚动条.滑动事件等功能,兼容CommonJS/AMD/CMD模块规范,开源,免费的轻量级html5滚动插件. JRoll第二版是在JRoll第一版基础上重写JRoll滑动算法,基于时间运动,解决帧频降低时滑动缓慢的问题,更改垂直水平方向判断方法,使捕获垂直水平方向更准确灵敏. JRoll第二版增减了一些api不完全兼容JRoll第一版. 先睹为快 http://www.chjtx.com/JRoll/demos/ 运行示例

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

今天在国外的网站上看到了很多看似简单却又非常强大的纯 CSS 绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和网站小图标,真的非常强大,分享给大家. Square (正方形) #square { width: 100px; height: 100px; background: red; } Rectangle (矩形) #rectangle { width: 200px; height: 100px; background: red; } Circle (圆形

可能是史上最强大的js图表库——ECharts带你入门

PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 StanZhai 两位仁兄让我试试 ECharts ,去主页看到<Why ECharts ?>简单了解了一下之后,ECharts很快吸引了我.里面引自马云的那句话“互联网还没有搞清楚的时候,移动互联网来了,移动互联没有搞清楚的时候,大数据来了”我是第一次听到,实在震撼了我啊(孤陋寡闻...). 本来没打算写什么的.可是作为一个后端开发者,看了半天文档也迷迷糊糊,查了一堆资料也没搞懂Echarts那

史上最强大网盘,网络上的赚钱神器【Yunfile网盘】,注册就送8元

YunFile.com,是提供在线存储和文件保存服务最大的网站之一,从2007年创立至今,我们提供免费的和您可以承受的收费服务.这些服务包括高级在线存储/远程备份服务,和先进的上传和下载工具. 上百万来自超过250个国家,从事各种行业的人们每天都在使用我们的服务.对Email来说发送一个文件太大怎么办?YunFile.com 可以帮助你.它可以使下载你喜欢的文件变得非常容易和方便! 分享产生价值: 注册一个账户是免费.快速而容易的.使用我们提供的工具上传文件并且复制下载链接.在您的网站上或者是可

史上最强大的js图表库——ECharts带你入门(转)

出处:http://www.cnblogs.com/zrtqsk/p/4019412.html PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 StanZhai 两位仁兄让我试试 ECharts ,去主页看到<Why ECharts ?>简单了解了一下之后,ECharts很快吸引了我.里面引自马云的那句话“互联网还没有搞清楚的时候,移动互联网来了,移动互联没有搞清楚的时候,大数据来了”我是第一次听到,实在震撼了我啊(孤陋寡闻...). 本来没打