自动化测试-web(PO:Page Object 模式)

一、PO模式

PO:Page Object(页面对象),将自动化涉及的页面或模块封装成对象。

PO能解决什么问题?

  1. 代码复用性
  2. 便于维护(脚本层与业务分离)--如果元素信息发生变化了,也不用去修改脚本。

PO如何做?

Base层:存放所有页面公共方法

Page层:基于页面或模块单独封装当前页面要操作的对象

Script层:脚本层+unittest

非PO模式的代码实现

import unittest
from selenium import webdriver
from time import sleep

class TestLogin(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome("/usr/local/bin/chromedriver")
        self.driver.maximize_window()
        self.driver.get("http://hmshop-test.itheima.net/Home/user/login.html")
        self.driver.implicitly_wait(10)

    def tearDown(self) -> None:
        sleep(5)
        self.driver.quit()

    def test01_login(self):
        self.driver.find_element_by_css_selector("#username").send_keys("13600001111")
        self.driver.find_element_by_css_selector("#password").send_keys("123456")
        self.driver.find_element_by_css_selector("#verify_code").send_keys("8888")
        self.driver.find_element_by_css_selector(".J-login-submit").click()

PO设计结构:

base:存放所有page页面公共方法

page:将页面封装为对象

script:测试脚本

案例:

base.py

"""
base类,存放所有page页面公共操作方法
"""

from selenium.webdriver.support.wait import WebDriverWait

class Base:
    def __init__(self,driver):
        self.driver = driver

    # 查找元素
    def base_find(self,loc,timeout=10,poll_frequency=0.5):
        # 显示等待->查找元素  loc=(By.ID,"#userA")
        return WebDriverWait(self.driver,timeout,poll_frequency).\
            until(lambda x:x.find_element(loc[0],loc[1]))

    # 输入方法
    def base_input(self,loc,value):
        # 获取元素
        el = self.base_find(loc)
        # 清空操作
        el.clear()
        # 输入内容
        el.send_keys(value)

    # 点击方法
    def base_click(self,loc):
        self.base_find(loc).click()

    # 获取文本值方法
    def base_get_text(self,loc):
        return self.base_find(loc).text

page_login.py

"""
模块名:page_模块
类名:大驼峰将模块移植进来,去掉下划线和数字。
方法:自动化测试当前页面要操作哪些元素,就封装哪些方法
"""
from po.base.base import Base
from selenium.webdriver.common.by import By

# 用户名
username = (By.CSS_SELECTOR,"#username")
# 密码
pwd = (By.CSS_SELECTOR,"#password")
# 验证码
verify_code = (By.CSS_SELECTOR,"#verify_code")
# 登录按钮
login_btn = (By.CSS_SELECTOR,".J-login-submit")
# 昵称
nick_name = (By.CSS_SELECTOR,".userinfo")


class PageLogin(Base):
    # 输入用户名
    def __page_username(self,value):
        self.base_input(username,value)
    # 输入密码
    def __page_pwd(self,value):
        self.base_input(pwd,value)
    # 输入验证码
    def __page_verify_code(self,value):
        self.base_input(verify_code,value)
    # 点击登录按钮
    def __page_click_login_btn(self):
        self.base_click(login_btn)
    # 获取昵称
    def page_get_nickname(self):
        return self.base_get_text(nick_name)
    # 组合业务方法(测试业务层调用此方法,便捷)
    def page_login(self,phone,password,code):
        self.__page_username(phone)
        self.__page_pwd(password)
        self.__page_verify_code(code)
        self.__page_click_login_btn()
        

test_login.py

import unittest
from selenium import webdriver
from po.page.page_login import PageLogin

class TestLogin(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome("/usr/local/bin/chromedriver")
        self.driver.maximize_window()
        self.driver.get("http://hmshop-test.itheima.net/Home/user/login.html")
        self.login = PageLogin(self.driver)

    def tearDown(self) -> None:
        self.driver.quit()

    def test_login(self,phone="13600001111",password="123456",code="8888"):
        # 调用登录业务
        self.login.page_login(phone,password,code)
        # 断言
        nickname = self.login.page_get_nickname()
        print("nickname:",nickname)

二、数据驱动

什么是数据驱动?

  • 以测试数据驱动用例执行(测试数据和代码分离)

为什么要数据驱动?

  • 便于维护(维护的焦点从代码转到测试数据)

数据驱动如何操作?

  • 编写数据存储文件
  • 编写读取数据工具
  • 使用参数化引用

编写数据存储文件

  1. 新建json文件,在文件中编写一个{}
  2. 有几个模块,写几个key,值为列表
  3. 列表中参数化数据有几组,就写几个{}
  4. 每个{}中组成: 说明+参数数据+预期结果
{
    "login":[
        {
        "desc":"登录成功",
        "phone":"13600001111",
        "password":"123456",
        "code":"8888",
        "except_text":"13600001111"
        }
    ]
}

具体的代码:

json_test.json

{
    "login":[
        {
        "desc":"登录成功",
        "phone":"13600001111",
        "Password":"123456",
        "Code":"8888"
        }
    ]
}

read_json.py

import os
import json

def read_json(filename,key):
    filepath = os.path.dirname(os.path.dirname(__file__)) + os.sep + "data" + os.sep + filename
    arr = []
    with open(filepath,"r",encoding="utf-8") as f:
        for data in json.load(f).get(key):
            arr.append(tuple(data.values())[1:])
        return arr

test_login.py

import unittest
from po_test.page.page_login import PageLogin
from selenium import webdriver
from time import sleep
from parameterized import parameterized
from po_test.util.read_json import read_json

class TestLogin(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome("/usr/local/bin/chromedriver")
        self.driver.get("http://hmshop-test.itheima.net/Home/user/login.html")
        self.driver.maximize_window()
        self.pagelogin = PageLogin(self.driver)

    def tearDown(self) -> None:
        sleep(5)
        self.driver.quit()

    @parameterized.expand(read_json("json_test.json","login"))
    def test_login(self,phone,password,code):
        self.pagelogin.login(phone,password,code)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/542967.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

修改Catsxp暗蓝色背景

Catsxp浏览器自从123内核后,背景就是暗蓝色了,太辣眼睛了,开发者说是原生的。 今天我点击主题背景-恢复默认修复了! 所以是安装了一个主题引起的。

代码随想录刷题随记21-回溯1

代码随想录刷题随记21-回溯1 回溯法解决的问题 回溯法,一般可以解决如下几种问题: 组合问题:N个数里面按一定规则找出k个数的集合 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符…

STM32常见调试工具介绍

STM32的常见调试工具主要包括ST-LINK、USB转TTL、USB转485以及USB转CAN。这些工具在嵌入式系统开发、调试以及通信中发挥着重要的作用。 1.ST-LINK: ST-LINK是STMicroelectronics公司专为其STM32系列微控制器开发的调试和编程工具。既能仿真也能将编译好的程序下载…

【I/O】Unix IO 介绍

IO 模型(一) Unix IO 一个输入操作共包含两个阶段: 等待数据准备好从内核将数据复制到进程 对于一个套接字上的输入操作,通常第一步是等待数据从网络中到达,当数据到达时,先将数据复制到内核缓冲区中&a…

计算机网络——DHCP协议

前言 本博客是博主用于复习计算机网络的博客,如果疏忽出现错误,还望各位指正。 这篇博客是在B站掌芝士zzs这个UP主的视频的总结,讲的非常好。 可以先去看一篇视频,再来参考这篇笔记(或者说直接偷走)。 …

Kivy 学习2

from kivy.app import App from kivy.uix.button import Button from kivy.uix.floatlayout import FloatLayout from kivy.graphics import Rectangle, Colorclass FloatLayoutApp(App):def build(self):def update_rect(layout, *args):设置背景尺寸,可忽略layout…

C++知识点总结(29):递归练习

一、满足条件的值 1. 审题 已知&#xff1a; S 1 2 4 7 11 16 … S12471116… S12471116… 递归求解刚好大于等于 5000 5000 5000 时 S S S 的值。 2. 参考答案 #include <iostream> using namespace std;// 定义递归函数&#xff0c;计算第x个数的值 int f(…

LeetCode700:验证二叉搜索树

题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 代码 使用中序…

Linux:zabbix—windows端agent部署(4)

本章的内容是通过在windows操作系统上部署zabbix的agent插件&#xff0c;从而实现通过zabbix来监控Windows 1.获取安装包 访问官方下载网站 Download Zabbix agentshttps://www.zabbix.com/cn/download_agents 2.部署agent 下载下来&#xff0c;放到要监控的Windows设备上双…

蓝桥杯— —小明的背包问题

小明的背包问题 小明的背包1 — — &#xff08;01背包&#xff09; 友情链接&#xff1a;小明的背包1 题目&#xff1a; 输入样例: 5 20 1 6 2 5 3 8 5 15 3 3 输出样例&#xff1a; 37思路&#xff1a; 对于01背包问题&#xff0c;其中一个重要的条件是每一种物品只有一个…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题4

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题4 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…

【Godot4.2】myPoint类 - 基于旋转和移动的点求取方式

概述 记得很久以前&#xff08;大约17年前&#xff09;有个用指令绘图的软件&#xff08;不是LOGO&#xff0c;而是它的一个模仿者&#xff0c;我找半天实在找不到。&#xff09;&#xff0c;基于移动和旋转来绘制折线。每次移动和旋转都是基于当前位置和方向&#xff0c;就像…

项目4-图书管理系统2+统一功能处理

1. 拦截器&#xff08;Interceptor&#xff09; 我们完成了强制登录的功能, 后端程序根据Session来判断用户是否登录, 但是实现⽅法是比较麻烦的。 所需要处理的内容&#xff1a; • 需要修改每个接⼝的处理逻辑 • 需要修改每个接⼝的返回结果 • 接⼝定义修改, 前端代码也需…

分享一个预测模型web APP的功能模块和界面的设计

一个临床预测模型web APP功能模块与界面设计 随着医疗技术的不断进步&#xff0c;web APP是临床预测模型在医学领域的应用的重要形式。这里分享一个web APP的设计&#xff0c;手里有医学预测模型的可以尝试将其构建成webAPP&#xff0c;进而在临床实践中体验预测模型带来的便利…

BugkuCTF:overflow2[WriteUP]

从题目中下载得到pwn文件 使用checksec工具对它进行检查&#xff0c;没有栈溢出保护 再根据题目提示可以知道这道题应该是利用栈溢出漏洞来做 把该文件放到linux中运行&#xff0c;可以看到有一个输入、输出的操作 把pwn丢进IDA里进行反编译分析 先看main函数&#xff0c;分…

Windows Server 2016虚拟机安装教程

一、VMware Workstation虚拟机软件的下载 官网下载入口&#xff1a;​​​​​​Download VMware Workstation Pro - VMware Customer Connect​​​​​ 下载好之后自己看着提示安装软件就好. 二、镜像文件的下载 下载网站入口&#xff1a;MSDN, 我告诉你 - 做一个安静…

关注招聘 关注招聘 关注招聘

&#x1f525;关注招聘 &#x1f525;关注招聘 &#x1f525;关注招聘 &#x1f525;开源产品&#xff1a; 1.农业物联网平台开源版 2.充电桩系统开源版 3.GPU池化软件(AI人工智能训练平台/推理平台) 开源版 产品销售&#xff1a; 1.农业物联网平台企业版 2.充电桩系统企业…

BCD BIN 转换

1&#xff0c;BCD是将10进制的每一位转换成2进制 如22 的中数子2的2进制就是0010&#xff0c;那么22的BCD 嘛就是 0010 0010 2&#xff0c;bin 的就是将2进制的每4位转成10进制 如 34的2进制就是0010 0010 高四位和低四位都是 0010 &#xff0c;0010对应的10进制就是2 那么…

FPGA压缩算法 (一)

压缩算法 简介 压缩算法是通过去除冗余信息来达到的&#xff0c;在图像压缩算法中一般是通过去除编码冗余、像素间冗余、心理视觉冗余这三者之间的一个或多个来完成的。 编码冗余&#xff1a;当所用码字大于最佳编码长度的时候出现的冗余 像素间冗余&#xff1a;因为图像数据间…

Redis:发布和订阅

文章目录 一、介绍二、发布订阅命令 一、介绍 Redis的发布和订阅功能是一种消息通信模式&#xff0c;发送者&#xff08;pub&#xff09;发送消息&#xff0c;订阅者&#xff08;sub&#xff09;接收消息。这种功能使得消息发送者和接收者不需要直接建立连接&#xff0c;而是通…