selenium+unittest实现po模型

1.PO模型简介:

PO模型是Page Object Model的简写, 页面对象模型。
PO模型又叫PO设计模式,是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,将页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,在实际测试中只需要关注业务流程,从而提高可维护性。
PO模型简单来说:就是通过面向对象的方式,封装页面定位和页面动作操作。与测试的逻辑分开。

通俗解释一下就是每个页面当成一个对象,给这些页面写一个类,每一个page class维护着该web页的标签元素集和操作这些元素的方法;至于测试脚本则单独写,需要什么就去这些页面类去调用即可。这样的好处就是如果页面元素发生变化,你去维护页面类即可,测试类你基本不用管。

po 是一种设计思想,不同的人根据这个思想写出来的代码是不一样的。(重点看如何封装)

总结:PO模型实现过程是:通过面向对象的方式,对页面定位和页面操作进行分离封装(解耦合,方便后续维护)。

优点:
提高代码的可读性
减少了代码的重复
提高代码的可维护性, 特别是针对UI界面频繁变动的项目.
(也就是面向对象的优点)
缺点:
造成项目结构比较复杂(因为是根据流程进行了模块化处理)

2.如何实现 PO 模型

PO模型一般首先抽象封装一个BasePage类,这个基类拥有一些指向Webdriver实例的属性,然后每一个Page继承基类BasePage,可以通过driver管理每一个Page中的元素,而且在Page中将这些操作封装为一个一个的方法。在测试用例中使用这些page类,进行组织测试步骤的工作。

这样做的好处,就是有元素变化,只需要维护每一个Page就行了,测试步骤变化,只需要维护TestCase即可。

PO实现案例:

点击百度,输入123,点击搜索,找到好123的官网,进入,在官网找到百度地图,点击查看。

案例分析

page为3,第一页为百度搜索页,第二页为好123搜索页,第三页为百度地图展示页。根据PO模型的设计理念,基类的封装一般包括,定位,点击,输入发送请求等。因为是多页,所以unittest应该使用@classmethod实现,所以如下:

basepage:基类   searchpage:页数       test_case:测试用例
# base.py
# 基类,实际上也就是封装-------把公共的方法封装起来,用的时候直接调用即可
from selenium.webdriver.common.action_chains import ActionChains  # 鼠标操作


class BasePageClass(object):
    def __init__(self, driver, url):
        self.driver = driver
        self.base_url = url

    # 进入网址
    def get(self):
        self.driver.get(self.base_url)

    # 元素定位,替代八大定位
    def get_element(self, *locator):
        return self.driver.find_element(*locator)

    # 点击
    def left_click(self, *locator):
        ActionChains(self.driver).click(self.get_element(*locator)).perform()

    # 输入
    def send_text(self, text, *locator):
        self.driver.find_element(*locator).send_keys(text)

    # 清除
    def clear_text(self, *locator):
        self.driver.find_element(*locator).clear()

# search01.py
# 继承基类。业务逻辑的实现。如果有多页,则有多个该文件
from basepage.base import BasePageClass
from selenium.webdriver.common.by import By


class SearchPageClass01(BasePageClass):
    def __init__(self, driver, url):
        BasePageClass.__init__(self, driver, url)

    # 1.进入百度
    def go_baidu(self):
        self.get()

    # 2.定位百度输入框并清空发送文本
    def input(self, text):
        self.get_element(By.ID, "kw").click()
        self.send_text(text, By.ID, "kw")

    # 3.点击搜索按钮
    def click(self):
        self.left_click(By.ID, "su")

    # 4.定位好123点击
    def hao123(self):
        self.get_element(By.XPATH, ".//*[@id='1']/h3/a[1]").click()

# search02.py
# 继承基类。业务逻辑的实现。如果有多页,则有多个该文件
from basepage.base import BasePageClass
from selenium.webdriver.common.by import By


class SearchPageClass02(BasePageClass):
    def __init__(self, driver, url):
        BasePageClass.__init__(self, driver, url)

    # 定位百度地图并点击
    def biumap(self):
        self.get_element(By.XPATH, ".//*[@id='userCommonSites']/ul/li[6]/div/a").click()

# search03.py
# 继承基类。业务逻辑的实现。如果有多页,则有多个该文件
from basepage.base import BasePageClass

class SearchPageClass03(BasePageClass):
    def __init__(self, driver, url):
        BasePageClass.__init__(self, driver, url)
# test_01.py
# 继承基类。业务逻辑的实现。如果有多页,则有多个该文件
from basepage.base import BasePageClass

class SearchPageClass03(BasePageClass):
    def __init__(self, driver, url):
        BasePageClass.__init__(self, driver, url)

以上就是最简单的实现PO模型的全部内容

如果要导入日志,报告,数据等其他的内容,可以参考博客:https://www.cnblogs.com/helenMemery/p/6687669.html

posted @ 2021-06-15 19:41  醉魔君  阅读(155)  评论(0编辑  收藏  举报