如下图,代码中4个数据,产生了4个页面,怎么实现只打开一个页面?可使用单例模式

查询得知 单例模式实现有5种方法,参照链接下:

https://blog.csdn.net/SixStar_FL/article/details/126894579

1. 使用模块
2. 使用装饰器
3. 使用类
4. 基于 __new__ 方法实现
5.基于 metaclass 方式实现

这里我们分别使用装饰器方法和__new__方法,

装饰器方法代码如下:

 1 # singledriver.py
2 from selenium import webdriver
3
4 def singledriver(cls,*args,**kw):
5 instances = {}
6 def _singledriver():
7 if cls not in instances:
8 instances[cls] = cls(*args,**kw)
9 print(instances)
10 return instances[cls]
11 return _singledriver
12
13 @singledriver
14 class SingleDriver():
15 """driver单例"""
16 def __init__(self):
17 self.driver = webdriver.Firefox()
 1 # basepage.py
2 from utils.singledriver import SingleDriver
3
4 class BasePage(MyDriver):
5 """
6 基类 用作初始化 封装常用操作
7 """
8 def __init__(self):
9 """
10 初始化driver
11 """
12 self.driver = SingleDriver().driver
13 self.calurl = r'http://cal.apple886.com/'
14 self.digit_btn = (By.ID, 'simple{}')
15 self.open_page()
16 self.driver.maximize_window()
17
18 if __name__ == "__main__":
19 a=BasePage()
20 b=BasePage()

分析如下:

1、self.driver = SingleDriver().driver调用SingleDriver()类,因为有装饰器,直接先到装饰器singledriver这里,此时cls为空

2、所以cls不在instance中,执行instances[cls] = cls(*args,**kw),给instances字典增加键值对,instances结果如下:

{<class '__main__.SingleDriver'>: <__main__.SingleDriver object at 0x0000020756718910>}

但是这行我完全看不懂......

3、第二次调用BasePage时,同样第一步,但此时cls不为空了,所以不会向instance增加新的内容,而是直接返回原来的,也就是没有再次实例化新的driver

__new__方法代码如下:

 1 # basepage.py
2 class MyDriver():
3 _instance = None
4 def __new__(cls, *args, **kwargs):
5 if not cls._instance:
6 cls._instance = super(MyDriver, cls).__new__(cls, *args, **kwargs)
7 cls.driver = webdriver.Firefox()
8 return cls._instance
9
10 class BasePage(MyDriver):
11 """
12 基类 用作初始化 封装常用操作
13 """
14 def __init__(self):
15 """
16 初始化driver
17 """
18 # self.driver = SingleDriver().driver
19 self.calurl = r'http://cal.apple886.com/'
20 self.digit_btn = (By.ID, 'simple{}')
21 self.open_page()
22 self.driver.maximize_window()
23
24 if __name__ == "__main__":
25 a=BasePage()
26 b=BasePage()

这个逻辑也一样,只是把定义driver放在了__new__中了

cls._instance = super(MyDriver, cls).__new__(cls, *args, **kwargs)  这个看不懂......

参考如下:

(117条消息) python装饰器的理解_自己合计的博客-CSDN博客

(117条消息) Python中cls代表什么意思?_cls参数python_温柔的行子的博客-CSDN博客

(117条消息) Python类内的cls和self,及单例模式的探究_LSG.haha的博客-CSDN博客

python单例模式&selenium driver实现单例_wx63186321c235c的技术博客_51CTO博客

(117条消息) python中的单例模式_python中单例_程序员老华的博客-CSDN博客

QA|4个数据打开了4个页面,怎么实现只打开一个页面?单例模式|网页计算器自动化测试实战的更多相关文章

  1. Javascript把数据从一个页面的层传递到另一个页面层里面

    背景:昨天头脑发热投了某一家国企的计算机类岗位(说是有前端岗位),通过找同学内推,虽然也笔试了一大堆题目(行测题,计算机网络,http协议,英译汉,古诗文默写,自己把品质排序并且进行200字以上的阐述 ...

  2. webveiw返回死循环问题以及在打开web页面会唤起浏览器打开的问题解决

    微信.QQ空间等大量软件都内嵌了H5,不得不说这是一种趋势,Andriod与H5互调可以让我们实现混合开发.至于混合开发就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html 5来开发 ...

  3. A、B同时打开一个页面进行同一条数据库记录进行修改,A修改完成后提交表单,A修改的数据保存完成后;当B也修改完成后,提交数据进行数据修改。此时B修改的内容会覆盖A修改的内容,请问如何避免?

    A.B同时打开一个页面进行数据中的一条数据进行修改,A修改完成后提交表单,数据修改保存完成后B开始页面也修改完成,开始提交进行修改.此时B修改的内容会覆盖A的内容,请问如何避免? 通过搜索和我个人总结 ...

  4. asp.net数据加载进度和模态窗口的完美打开,而且窗口不被阻止

    采用jquery的技术打开模态窗口,效果肯定不错,但是微软的asp.net ajax就无法用了,例如updatepanel面板和updateprogress就看不到效果,也就是jquery与asp.n ...

  5. Python GDAL读取栅格数据并基于质量评估波段QA对指定数据加以筛选掩膜

      本文介绍基于Python语言中gdal模块,对遥感影像数据进行栅格读取与计算,同时基于QA波段对像元加以筛选.掩膜的操作.   本文所要实现的需求具体为:现有自行计算的全球叶面积指数(LAI).t ...

  6. 在小程序中修改上一个页面里data中的数据调用上一个页面的方法

    //获取已经打开的页面的数组 var pages = getCurrentPages(); //获取上一个页面的所有的方法和data中的数据  var lastpage = pages[pages.l ...

  7. 【小程序】微信小程序打开其他小程序(打开同一主体公众号下关联的另一个小程序)

    微信小程序打开其他小程序(打开同一公众号下关联的另一个小程序) 注:只有同一(主体)公众号下的关联的小程序之间才可相互跳转  wx.navigateToMiniProgram(OBJECT) wx.n ...

  8. asp 数据库 模块化 - 思路是没一个页面有一个自己的数据类 这里用nPath表示

    <!--#include file="db_class.asp" --> <% '当前页面数据 nPath = "..\..\.." 't模块 ...

  9. 用js把数据从一个页面传到另一个页面

    用js把数据从一个页面传到另一个页面的层里? 如果是传到新页面的话,你网站基于什么语言开发直接用get或者post获取,然后输出到这个层 通过url传参 如果是HTML页面的话JS传到新页面就wind ...

  10. Visual Studio 打开解决方案后 弹出框显示 "正在打开文件..." 迟迟没反应 的解决方法

    Visual Studio 打开解决方案后 弹出框显示 "正在打开文件...",任务管理器的devenv进程又很正常,不会显示"未响应". 而IDE的左下角有个 ...

随机推荐

  1. linux PXE和无人值守

    目录 一.pxe概念 二.pxe相关服务 三.pxe装机流程 四.pxe四大文件 五.无人值守 六.实验 自动装机 一.pxe概念 概念:PXE(预启动执行环境)是由Intel公司开发的网络引导技术, ...

  2. remote: HTTP Basic:Access denied fatal:Authentication failed for

    近来在一天新电脑上面使用git pull 一个项目,老是提示 Access denied, 找了许多方法,ssh key这些都配置了还是不行,当时别提有多尬 看嘛这就是pull 时的提示 // *** ...

  3. 代码随想录算法训练营Day46 动态规划

    代码随想录算法训练营 代码随想录算法训练营Day46 动态规划| ●  139.单词拆分 关于多重背包,你该了解这些! 背包问题总结篇! 139.单词拆分 题目链接:139.单词拆分 给定一个非空字符 ...

  4. R 包 optparse 之命令行参数传递

    对于经常与 Linux 打交道的生物信息分析童鞋们,我们今天分享一下怎么在命令行下通过传递参数(类似perl.python) 的方式执行 R 脚本. 一般来说,命令行下使用 Rscript 执行 R ...

  5. clusterProfiler 的 GO/KEGG 富集分析用法小结

    以下文章来源于简书,作者 biobin,文章已获原作者授权. 前言 关于 clusterProfiler这个 R 包就不介绍了,网红教授宣传得很成功,功能也比较强大,主要是做 GO 和 KEGG 的功 ...

  6. 曲线艺术编程 coding curves 第九章 旋轮曲线(ROULETTE CURVES)

    第九章 旋轮曲线(ROULETTE CURVES) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物 ...

  7. 第二章 VM与Linux的安装

    1. VMWare 安装 ​​ ‍ ​​ ‍ ‍ 2. CentOS 安装 ‍ 安装网址:https://blog.csdn.net/qq_41819965/article/details/11118 ...

  8. 好的,以下是我为您拟定的自然语言处理(NLP)领域的100篇热门博客文章标题,以逻辑清晰、结构紧凑、简单易懂的

    目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 1. 机器翻译 2. 文本分类 3. 情感分析 5. 优化与改进 6. 结论与展望 好的,以下是我为您拟定的 ...

  9. 使用Kettle定时从数据库A刷新数据到数据库B

    一.需求背景 由于项目场景原因,需要将A库(MySQL)中的表a.表b.表c中的数据定时T+1 增量的同步到B库(MySQL).这里说明一下,不是数据库的主从备份,就是普通的数据同步.经过技术调研,发 ...

  10. [随笔]记一此更新win10后mysql服务消失的问题

    十几天前系统自动更新 没在意 几天前用php连mysql的时候 报错 Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] 由于目标计算 ...