QA|4个数据打开了4个页面,怎么实现只打开一个页面?单例模式|网页计算器自动化测试实战
如下图,代码中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个页面,怎么实现只打开一个页面?单例模式|网页计算器自动化测试实战的更多相关文章
- Javascript把数据从一个页面的层传递到另一个页面层里面
背景:昨天头脑发热投了某一家国企的计算机类岗位(说是有前端岗位),通过找同学内推,虽然也笔试了一大堆题目(行测题,计算机网络,http协议,英译汉,古诗文默写,自己把品质排序并且进行200字以上的阐述 ...
- webveiw返回死循环问题以及在打开web页面会唤起浏览器打开的问题解决
微信.QQ空间等大量软件都内嵌了H5,不得不说这是一种趋势,Andriod与H5互调可以让我们实现混合开发.至于混合开发就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html 5来开发 ...
- A、B同时打开一个页面进行同一条数据库记录进行修改,A修改完成后提交表单,A修改的数据保存完成后;当B也修改完成后,提交数据进行数据修改。此时B修改的内容会覆盖A修改的内容,请问如何避免?
A.B同时打开一个页面进行数据中的一条数据进行修改,A修改完成后提交表单,数据修改保存完成后B开始页面也修改完成,开始提交进行修改.此时B修改的内容会覆盖A的内容,请问如何避免? 通过搜索和我个人总结 ...
- asp.net数据加载进度和模态窗口的完美打开,而且窗口不被阻止
采用jquery的技术打开模态窗口,效果肯定不错,但是微软的asp.net ajax就无法用了,例如updatepanel面板和updateprogress就看不到效果,也就是jquery与asp.n ...
- Python GDAL读取栅格数据并基于质量评估波段QA对指定数据加以筛选掩膜
本文介绍基于Python语言中gdal模块,对遥感影像数据进行栅格读取与计算,同时基于QA波段对像元加以筛选.掩膜的操作. 本文所要实现的需求具体为:现有自行计算的全球叶面积指数(LAI).t ...
- 在小程序中修改上一个页面里data中的数据调用上一个页面的方法
//获取已经打开的页面的数组 var pages = getCurrentPages(); //获取上一个页面的所有的方法和data中的数据 var lastpage = pages[pages.l ...
- 【小程序】微信小程序打开其他小程序(打开同一主体公众号下关联的另一个小程序)
微信小程序打开其他小程序(打开同一公众号下关联的另一个小程序) 注:只有同一(主体)公众号下的关联的小程序之间才可相互跳转 wx.navigateToMiniProgram(OBJECT) wx.n ...
- asp 数据库 模块化 - 思路是没一个页面有一个自己的数据类 这里用nPath表示
<!--#include file="db_class.asp" --> <% '当前页面数据 nPath = "..\..\.." 't模块 ...
- 用js把数据从一个页面传到另一个页面
用js把数据从一个页面传到另一个页面的层里? 如果是传到新页面的话,你网站基于什么语言开发直接用get或者post获取,然后输出到这个层 通过url传参 如果是HTML页面的话JS传到新页面就wind ...
- Visual Studio 打开解决方案后 弹出框显示 "正在打开文件..." 迟迟没反应 的解决方法
Visual Studio 打开解决方案后 弹出框显示 "正在打开文件...",任务管理器的devenv进程又很正常,不会显示"未响应". 而IDE的左下角有个 ...
随机推荐
- linux PXE和无人值守
目录 一.pxe概念 二.pxe相关服务 三.pxe装机流程 四.pxe四大文件 五.无人值守 六.实验 自动装机 一.pxe概念 概念:PXE(预启动执行环境)是由Intel公司开发的网络引导技术, ...
- remote: HTTP Basic:Access denied fatal:Authentication failed for
近来在一天新电脑上面使用git pull 一个项目,老是提示 Access denied, 找了许多方法,ssh key这些都配置了还是不行,当时别提有多尬 看嘛这就是pull 时的提示 // *** ...
- 代码随想录算法训练营Day46 动态规划
代码随想录算法训练营 代码随想录算法训练营Day46 动态规划| ● 139.单词拆分 关于多重背包,你该了解这些! 背包问题总结篇! 139.单词拆分 题目链接:139.单词拆分 给定一个非空字符 ...
- R 包 optparse 之命令行参数传递
对于经常与 Linux 打交道的生物信息分析童鞋们,我们今天分享一下怎么在命令行下通过传递参数(类似perl.python) 的方式执行 R 脚本. 一般来说,命令行下使用 Rscript 执行 R ...
- clusterProfiler 的 GO/KEGG 富集分析用法小结
以下文章来源于简书,作者 biobin,文章已获原作者授权. 前言 关于 clusterProfiler这个 R 包就不介绍了,网红教授宣传得很成功,功能也比较强大,主要是做 GO 和 KEGG 的功 ...
- 曲线艺术编程 coding curves 第九章 旋轮曲线(ROULETTE CURVES)
第九章 旋轮曲线(ROULETTE CURVES) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物 ...
- 第二章 VM与Linux的安装
1. VMWare 安装 2. CentOS 安装 安装网址:https://blog.csdn.net/qq_41819965/article/details/11118 ...
- 好的,以下是我为您拟定的自然语言处理(NLP)领域的100篇热门博客文章标题,以逻辑清晰、结构紧凑、简单易懂的
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 4. 应用示例与代码实现讲解 1. 机器翻译 2. 文本分类 3. 情感分析 5. 优化与改进 6. 结论与展望 好的,以下是我为您拟定的 ...
- 使用Kettle定时从数据库A刷新数据到数据库B
一.需求背景 由于项目场景原因,需要将A库(MySQL)中的表a.表b.表c中的数据定时T+1 增量的同步到B库(MySQL).这里说明一下,不是数据库的主从备份,就是普通的数据同步.经过技术调研,发 ...
- [随笔]记一此更新win10后mysql服务消失的问题
十几天前系统自动更新 没在意 几天前用php连mysql的时候 报错 Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] 由于目标计算 ...