PO模式的简单实现

一、PO模式简介

PO(Page Object Model)设计模式是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,让代码结构清晰,增加复⽤性。
在这里插入图片描述
从上图可以看出PO分层模型,PO分为以下三层:
表现层:页面上可见的元素,都属于表现层。
操作层:对页面可见元素的操作。
业务层:上面2层的组合,并联合到一起形成某个业务动作,在页面中对若干元素操作后所实现的操作。

二、PO模式设计准则

1.使用公共方法来代表页面提供的服务;
2.不要暴露页面的内部细节;
3.PO本身通常不应进行判断或断言,判断和断言是测试的一部分,应始终在测试的代码内,而不是在PO中;
4.方法返回其他的页面对象,进行页面的关联;
5.PO不一定需要代表整个页面,定义所需要实现的业务的部分即可;
6.相同的操作带来的不同结果可以封装成不同的方法。

三、简单PO模式实现

以登录百度为例,项目结构如下图所示:
在这里插入图片描述

1.首先进行浏览器的封装。

comm_driver.py 示例代码

from selenium import  webdriver
class Comm_Driver:
    def getdriver(self):
        # 创建driver对象
        self.driver=webdriver.Chrome()
        # 最大化窗口
        self.driver.maximize_window()
        # 隐式等待
        self.driver.implicitly_wait(10)
        # 返回driver对象
        return self.driver
2.基类封装

功能:

  • 打开浏览器
  • 输入网址
  • 定位元素
  • 点击元素
  • 输入文本
  • 获取元素文本

basePage.py 示例代码

from common.comm_driver import Comm_Driver

class BasePage(Comm_Driver):
    def __init__(self):
        self.driver=Comm_Driver().getdriver()
    # 打开网址
    def get_url(self,url):
        self.driver.get(url)
    # 定位元素
    def get_ele(self,locator):
        return self.driver.find_element(*locator)
    # 点击元素
    def click_ele(self,locator):
        self.get_ele(locator).click()
    # 输入文本
    def input_text(self,locator,text,append=True):
        if append:
            self.get_ele(locator).clear()
            self.get_ele(locator).send_keys(text)
        else:
            self.get_ele(locator).send_keys(text)
    # 获取元素的文本
    def get_ele_text(self,locator):
        return self.get_ele(locator).text
3.登录页封装

功能:

  • 打开百度
  • 打开登录弹窗
  • 登录系统

loginPage.py 示例代码

from common.basePage import BasePage
from common.elements import *


class LoginPage(BasePage):
    # 打开百度
    def open_page(self):
        self.get_url('https://www.baidu.com')
    # 点击右上角登录,打开登录弹窗
    def click_loginbutton(self):
        self.click_ele(login_button)
    # 登录
    def login_baidu(self,phonenum,password):
        self.input_text(phone_input,phonenum)
        self.input_text(password_input,password)
        self.click_ele(login_button_two)

4.定位器
login_button=('id','s-top-loginbtn')
phone_input=('name','userName')
password_input=('id','TANGRAM__PSP_11__password')
login_button_two=('id','TANGRAM__PSP_11__submit')
5.测试用例

test_login.py 示例代码

from pageObjects.loginPage import LoginPage


class Test_Login():
    def test_login(self):
        test_loginpage=LoginPage()
        test_loginpage.open_page()
        test_loginpage.click_loginbutton()
        test_loginpage.login_baidu('你的手机号','你的密码')
        assert test_loginpage.get_ele_text(['xpath',"//*[text()='安全验证']"])=='安全验证'
6.测试结果

在这里插入图片描述

四、总结

首先抽象封装成一个BasePage类,这个基类拥有一些指向Webdriver实例的属性,然后每一个Page继承基类BasePage,可以通过driver管理每一个Page中的元素,而且Page将这些操作封装为一个个的方法。有元素变化,我们只需要维护每一个Page,测试步骤变化,只需要维护TestCase即可。

此文只是简单举个例子,后续持续优化,实现数据分离,封装日志与截图,生成Allure报告等。
有错误欢迎指出~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值