Day23:POM设计模式(封装)

一、Pom模式+关键字驱动模式

po模式 : page object model 页面对象模式。

1、pom模式的好处:

解决:线性脚本的问题

解决:代码不能重复利用的问题

解决:后期的维护问题。

栗子:看过他们的仓库?日用品放一起,电器放一起,文具放一起。......分类。

2、POM模式分三层:

1.基础层:base 主要放selenium原生的方法。

2.页面对象层:po 主要用于放页面的元素和页面的动作。

3.测试用例层:testcase 存放测试用例以及测试数据。

(重点)页面对象层调用基础层的方法,测试用例层调用页面对象层。

3、unittest 的前后置处理(夹具)

setUp 在测试用例之前的准备工作

tearDown 在测试用例之后的扫尾工作

setUp(self):每个测试用例执行之前自动执行,做准备工作

常用:打开浏览器、访问网址、登录系统

tearDown(self):每个测试用例执行之后自动执行,做收尾工作

常用:关闭浏览器、清理测试数据

记住:

二、分装步骤

1、先建3层

2、base层:封装 selenium 原生方法(点击、输入、查找元素、等待等)

复制代码
from selenium import webdriver

class BasePage:
    def __init__(self):
        global driver
        # 打开浏览器
        self.driver = webdriver.Chrome()
        # 加载网页
        self.driver.get("http://localhost/ecshop/admin/privilege.php?act=logout")


    # 定位元素的关键字
    def locator_element(self, loc):
        # 接收定位元组,*loc解包,查找并返回页面元素
        return self.driver.find_element(*loc)

    # 设置值的关键字
    def send_keys(self, loc, value):
        # 调用元素定位方法,找到输入框,输入内容value
        self.locator_element(loc).send_keys(value)

3、page层:每个页面单独一个类,存放页面元素 定位和页面动作

复制代码
from selenium.webdriver.common.by import By
from base.base_page import BasePage

class LoginPage(BasePage):
    #页面的元素
    username_loc = (By.NAME,"username")
    password_loc = (By.NAME,"password")
    submit_loc = (By.XPATH,"//input[@value='进入管理中心']")

    #页面的动作
    def login_ecshop(self,username,password):
        #定位用户名输入框
        self.send_keys(LoginPage.username_loc,username)
        #定位密码输入框
        self.send_keys(LoginPage.password_loc,password)
        #定位登录按钮
        self.click(LoginPage.submit_loc)

4、testcase层:testcase 调用Page层,存放测试用例以及测试数据。

复制代码
import unittest
from page.login_page import LoginPage

class TestCase(unittest.TestCase):
    def test_01_login(self):
        """
        登录
        :return:
        """
        # 实例化登录页面对象(po层的LoginPage继承了base层的basePage,同时也会继承他的方法,所以这里实例化对象相当于执行了init函数)
        lp = LoginPage()
        # 调用登录业务方法,执行ecshop登录
        lp.login_ecshop()

其余看pycharm的testapi项目理解

三、断言

1、unittest 断言:

用于判断预期结果和实际结果是否相符,如果断言失败,用例直接标记失败。

复制代码
self.assertEqual()     # 判断两个值是否相等
self.assertTrue()      # 判断一个值是否为True
self.assertIn()        # 判断一个值是否包含在另一个值里面

四、完善达到在企业里面能够实际落地的web自动化测试框架

编程语言:python、java
设计模式:**POM(页面对象模型)**、关键字驱动模式
用例管理:unittest、pytest
数据驱动:ddt、@pytest.mark.parametrize ()
二次封装:excel 封装,ini/yaml 配置文件封装,数据库封装
日志监控:logger 日志收集
异常处理:try except
jenkins:持续集成、无人值守
Docker:镜像容器技术
分布式运行:Selenium Grid

相关推荐
ShineWinsu17 小时前
对于Qt:QProgressBar常见属性的解析
开发语言·c++·qt·进度条·gui·定时器·qprogressbar
fanruitian17 小时前
python 机器学习 交叉验证train_test_split 网格搜索GridSearchCV
开发语言·python·机器学习
AlanAshley17 小时前
无 SIM 卡也能打 110?手机紧急呼叫能力的软硬件技术探究
开发语言·智能手机·php
鬼手点金17 小时前
Skills:领域能力的可组合单元
java·人工智能·笔记·自动化·1024程序员节
modelmd17 小时前
Go 切片、映射常见使用场景
开发语言·后端·golang
是2的10次方啊17 小时前
设计模式与生活⑨:一碗胡辣汤,用不着认识十几种香料
设计模式
dialect_1 天前
KMP算法
开发语言·c++·算法
captain3761 天前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
Novproxy_Z1 天前
商用代理避坑:如何识别商家拿机房 IP 冒充住宅 IP
java·网络·tcp/ip
总要学点什么1 天前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节