// 小飞机置顶 返回顶部

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博客

posted @ 2023-06-09 15:11  T-Better  阅读(23)  评论(0编辑  收藏  举报
// 添加雪花飘落特效
返回顶端 // canvas炫酷背景 // 右下角目录栏