8.webUI入门及单例模式

时间:2021-08-21 15:32:25   收藏:0   阅读:24

webUI入门及单例模式

回归测试

版本迭代,进行优化,重新部署了新环境,只是前端页面发生了改变,api没有变化,只需要把host更换成新地址就可以
重新执行用例,用例通过

自动化类型分配

了解业务场景

webUI设计模式

PO模式一般适用于大型系统,我们只需要把页面的元素封装好放到对应的配置文件里面就可以了,页面比较多,页面元素频繁变动
PO库的实现

在pylib的webUI目录下,新建一个文件common.py,里面定义通用类BasePage,页面通用操作方法

class BasePage:
    def click(self):
        pass

    def input_text(self):
        pass

在pylib的webUI目录下,新建一个文件business.py,里面定义业类

#定义业务操作类
class LoginPage(BasePage):
    pass

点击和输入,都需要对页面元素进行操作,对页面操作就需要知道元素的定位方法,使用什么定位方法呢,id,name,css,xpath
我们不能给别人规定死,那怎么办呢,就需要写一个通用的定位方法
同时对元素进行操作,需要通过driver进行,需要先实例化一个driver

def __init__(self):
    self.driver=webdriver.Chrome()

但是这样会打开多个浏览器,每次实例化就打开一个浏览器,一个对象就是一个浏览器,多次实例化就打开多个浏览器

解决打开多个浏览器的方法

方法一:
外面实例化好driver,然后通过传参进来

class BasePage:
    def __init__(self,driver):
        self._driver=driver

    def click(self,locator):
        self._driver.find_element(*locator).click()

    def input_text(self,locator,text):
        self._driver.find_element(*locator).send_keys(text)


#定义业务操作类
class LoginPage(BasePage):
    pass

class MainPage(BasePage):
    pass

if __name__ == ‘__main__‘:
    from selenium import webdriver
    driver=webdriver.Chrome()
    LoginPage(driver)
    MainPage(driver)

方法二:
单例模式

单例模式

非单例模式
技术分享图片

日常见到的init方法是否产生对象?初始化方法并不产生对象
实例化就像新生儿一样,初始化就像给新生儿穿衣服一样,并不会产生新的
init方法必须先有对象才能使用,那什么方法可以产生对象呢?
new 方法来产生对象,同时init方法不能有返回值,new必须有返回值
如果我们需要实现单例模式,就必须从new这个地方下手
首先判断当前类是否有实例存在,存在就返回当前实例
hasattr()#相当于python的反射,如果当前对象存在某个属性(方法或者字段)就返回true,反之就是false
cls也是一个对象,由元类来产生,类控制对象,元类控制类
object类是所有类继承的祖先类

class Single:
    def __new__(cls, *args, **kwargs):#new产生对象,并且需要定义返回值
        #首先判断当前类是否有实例存在,如果存在就直接返回,否则就创建一个新的实例再返回
        if hasattr(cls,‘_isinstace‘):#hasattr相当于python的反射,如果当前类存在某个属性就返回true,否则返回false
            return cls._isinstace
        else:
            cls._isinstace=object.__new__(cls)
            return cls._isinstace
    def __init__(self):#初始化是否产生对象?不产生对象,init方法不可以有返回值
        pass

if __name__ == ‘__main__‘:
    assert Single()==Single()

看看子类是不是也具有相同特性?子类也具有父类的特性

class Child(Single):
    pass

if __name__ == ‘__main__‘:
    assert Child()==Child()

如果else里面没有其他语句,else可以省略,因为我们用了return,后面的语句就不会执行了

class Single:
    def __new__(cls, *args, **kwargs):#new产生对象,并且需要定义返回值
        #首先判断当前类是否有实例存在,如果存在就直接返回,否则就创建一个新的实例再返回
        if hasattr(cls,‘_isinstace‘):#hasattr相当于python的反射,如果当前类存在某个属性就返回true,否则返回false
            return cls._isinstace
        cls._isinstace=object.__new__(cls)
        return cls._isinstace
    def __init__(self):#初始化是否产生对象?不产生对象,init方法不可以有返回值
        pass
class Child(Single):
    pass

if __name__ == ‘__main__‘:
    assert Child()==Child()

至此单例模式已经调试完成,我们可以把当前代码放到pulgins模块下面
接着在common模块下面创建一个生成webdriver类,继承Single类来实现创建浏览器

class BasePage:
    def __init__(self):
        self._driver=WebdriverCreater().get_browser()

    def click(self,locator):
        self._driver.find_element(*locator).click()

    def input_text(self,locator,text):
        self._driver.find_element(*locator).send_keys(text)

class WebdriverCreater(Single):
    def get_browser(self):
        self._driver=webdriver.Chrome()
        self._driver.implicitly_wait(10)
        return self._driver

到business中测试
if name == ‘main‘:
LoginPage()
MainPage()

发现还是打开多个浏览器
分析发现,类已经是单例模式,但是get_browser(),不是单例模式,调用一次就生成一个浏览器
解决:使用单例模式的思想继续改造

class WebdriverCreater(Single):
    def get_browser(self):
        #如果存在就直接返回,没有就创建一个再返回
        if hasattr(self,‘_driver‘):
            return self._driver
        self._driver=webdriver.Chrome()
        self._driver.implicitly_wait(10)
        return self._driver

查看BY方法

class By(object):
    """
    Set of supported locator strategies.
    """

    ID = "id"
    XPATH = "xpath"
    LINK_TEXT = "link text"
    PARTIAL_LINK_TEXT = "partial link text"
    NAME = "name"
    TAG_NAME = "tag name"
    CLASS_NAME = "class name"
    CSS_SELECTOR = "css selector"

原文:https://www.cnblogs.com/xiehuangzhijia/p/15168975.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!