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