PO模式-unittest

2023-11-08

PO模式是指将页面元素的定位以及元素的操作分离出来,测试用例脚本直接调用这些封装好的元素操作来组织测试用例,从而实现了测试用例脚本和元素定位、操作的分离。

本文采用PO模式和unittest框架,对readmine系统执行了两条测试用例。

文件目录:

 PageObjects文件夹中,readmine_locators文件,存放元素定位。每个页面定义为一个类。

from selenium.webdriver.common.by import By


class LoginPageLocators():
    """用户登录页面"""
    LoginLink = (By.XPATH, '//*[@id="account"]/ul/li[1]/a')  # 打开首页的登录按钮
    Username = (By.ID, 'username')  # 登录名输入框
    Password = (By.ID, 'password')  # 密码输入框
    LoginButton = (By.NAME, 'login')
    LoginName=(By.ID,'loggedas')
    errormessage = (By.XPATH, '//*[@id="flash_error"]')


class ProjectListsPageLocators():
    """项目列表页面"""
    NewProjectButton = (By.XPATH, '//*[@id="content"]/div[1]/a[1]')


class NewProjectPageLocators():
    """新建项目页面"""
    ProjectName = (By.ID, 'project_name')  # 项目名文本框
    CommitButton = (By.NAME, 'commit')  # 创建项目按钮
    flashnotice = (By.ID, 'flash_notice')  # 创建成功/失败提示文本

readmine_operations存放对页面元素的操作,每个页面一个类,每个操作是一个函数

from ..PageObjects.readmine_locators import *
#这个包导入搞了好久
class BasePage():
    def __init__(self,driver):
        self.driver=driver

class LoginPage(BasePage):
    """用户登录页面的元素操作"""
    def enter_username(self,username):
        #输入用户名
        ele=self.driver.find_element(*LoginPageLocators.Username)
        ele.clear()
        ele.send_keys(username)
    def enter_password(self,password):
        ele=self.driver.find_element(*LoginPageLocators.Password)
        ele.send_keys(password)
    def click_login_button(self):
        ele=self.driver.find_element(*LoginPageLocators.LoginButton)
        ele.click()

    def find_login_name(self):
        #查找并返回登录成功后用户名
        ele = self.driver.find_element(*LoginPageLocators.LoginName)
        return ele
    def find_login_failed_info(self):
        #查找并返回登录失败后的提示信息元素
        ele=self.driver.find_element(*LoginPageLocators.errormessage)
        return ele

class NewProjectPage(BasePage):
    """新建项目页面操作"""
    def enter_project_name(self,projectname):
        #输入项目名
        ele=self.driver.find_element(*NewProjectPageLocators.ProjectName) #*用来调用类的属性?
        ele.clear()
        ele.send_keys(projectname)

    def click_commit_button(self):
        #点击创建成功按钮
        ele=self.driver.find_element(*NewProjectPageLocators.CommitButton)
        ele.click()

    def get_commit_message(self):
        #获取创建后提示
        ele=self.driver.find_element(*NewProjectPageLocators.flashnotice)
        return ele

class ProjectListPage(BasePage):
    def click_newproject_button(self):
        ele=self.driver.find_element(*ProjectListsPageLocators.NewProjectButton)
        ele.click()


Scenario文件夹下文件存放对场景。

readmine_login文件存放对于登录场景的类


from venv.Chapter12.Storm_12_1.PageObjects.readmine_operations import *

class LoginScenario():
    """封装登录页面场景操作"""
    def readmine_login(self,username,password):

        LoginPage(self).enter_username(username)#输入用户名和密码
        LoginPage(self).enter_password(password)
        LoginPage(self).click_login_button()
        return self






 readmine_new_project文件存放新建项目的场景


from venv.Chapter12.Storm_12_1.Scenario.readmine_login import *

import time
class NewProjectScenario():
    def readmine_new_project(self):
        #填写项目名并提交
        project_name='project_{}'.format(time.time())

        #访问项目列表页面
        ProjectListPage(self).click_newproject_button()
        NewProjectPage(self).enter_project_name(project_name)
        NewProjectPage(self).click_commit_button()
        return self


TestCase文件夹下,存放测试用例,一个场景一个文件。

test_001_login测试登录

import unittest
from selenium import  webdriver
from venv.Chapter12.Storm_12_1.Scenario.readmine_login import *
class TestStorm(unittest.TestCase):
    def setUp(self):
        self.driver=webdriver.Chrome()
        self.driver.get("http://demo.redmine.org/login")
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
    def test_successlogin(self):
        """ 正确的用户名正确的密码"""
        LoginScenario.readmine_login(self.driver,'1111111111','1111111111')

    def tearDown(self):
        self.driver.quit()



if __name__=='__main__':
    unittest.main()

test_001_newproject测试新建项目

import unittest
from selenium import  webdriver
from venv.Chapter12.Storm_12_1.Scenario.readmine_new_project import *
class TestStorm(unittest.TestCase):
    def setUp(self):
        self.driver=webdriver.Chrome()
        self.driver.get("http://demo.redmine.org/login")
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
        LoginScenario.readmine_login(self.driver, '11111111111', '111111111111111')
        self.driver.get("http://demo.redmine.org/projects")
    def test_new_project(self):

        NewProjectScenario.readmine_new_project(self.driver)
        ele=NewProjectPage(self.driver).get_commit_message()

        self.assertEqual(ele.text,'创建成功')


    def tearDown(self):
        self.driver.quit()



if __name__=='__main__':
    unittest.main()

注意事项:

1、注意包的导入。

2、注意什么时候用self,什么时候用self.driver。

3、注意页面之间的调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PO模式-unittest 的相关文章

  • 架构师需要了解的Paxos原理、历程及实战

    架构师需要了解的Paxos原理 历程及实战 数据库高可用性难题 数据库的数据一致和持续可用对电子商务和互联网金融的意义不言而喻 而这些业务在使用数据库时 无论 MySQL 还是 Oracle 都会面临一个艰难的取舍 就是如何处理主备库之间的
  • linux下部署redis

    基础知识 1 Redis的数据类型 字符串 列表 lists 集合 sets 有序集合 sorts sets 哈希表 hashs 2 Redis和memcache相比的独特之处 1 redis可以用来做存储 storge 而memcache
  • Java必懂之命名规范

    定义规范的目的是为了使项目的代码样式统一 使程序有良好的可读性 在此我从网上查找了一篇写得比较好的文章 来让大家学习 顺便自己复习一下 有时候自己写的类名不符合规范 Eclipse会出现黄色叹号 就是表示你的命名不规范 然而 规范不是规定

随机推荐

  • 微信小程序image图片自适应宽度比例显示的方法

    我们都知道微信小程序的组件image是用来显示图片的 它有一下几个属性 1 src 图片资源地址2 mode 图片裁剪 缩放的模式3 binderror 当错误发生时 发布到 AppService 的事件名 事件对象event detail
  • SpringMVC的架构有什么优势?——控制器(一)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 React从入门到精通 前端炫酷代码分享 从0到英雄 vue成神之路 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架
  • 合宙Air103

    基础资料 基于Air103开发板 Air103 LuatOS 文档 上手 开发上手 LuatOS 文档 探讨重点 对官方社区库接口RC522模块库调用及示例进行复现及分析 了解RDIF及非接触式IC卡的原理及操作方法 实现功能 利用已知的A
  • 单片机拟真电路图软件_电路仿真软件有哪些?6款常用的电路仿真软件推荐

    一些网友需要下载电路仿真软件这一类软件 但是 网络上寻找电路仿真软件却比较麻烦 那么 电路仿真软件有哪些 小编今天就给大家整理了6款常用的电路仿真软件推荐给大家 需要下载电路仿真软件的网友可以挑选一下 Machining 6款常用的电路仿真
  • Vue 监听localStorage

    1 在utils目录下建tool js文件 文件代码如下 重写setItem事件 当使用setItem的时候 触发 window dispatchEvent派发事件 function dispatchEventStroage const s
  • python turtle画海绵宝宝,python还能这么玩?帅呆了

    漫威还是DC 超人或者蝙蝠侠 火影忍者亦或死神 当然 所有这些讲的都是漫画 当我们还是孩子的时候 总是迷恋漫画书 当翻到我们的英雄们开始行动时会激动不已 大家总是争论谁是最厉害的超级英雄 认真地讨论他们的家族历史 或者梦想自己拯救高谭市 我
  • 容器编排学习(二)镜像制作和私有仓库介绍

    一 Dockerfile 1 概述 commit的局限 很容易制作简单的镜像 但碰到复杂的情况就十分不方便例如碰到下面的情况 需要设置默认的启动命令 需要设置环境变量 需要指定镜像开放某些特定的端口 Dockerfile就是解决这些问题的方
  • 悲剧的山寨采用的新芯片资料汇总(更新Rk3066)

    芯片名称 基友公司 上市前宣传主频 量产机最高主频 最高主频 GPU 备注 Rk3066 原道 酷比魔方 1 4GHz 2 1 6GHz 2 1 6GHz 2 Mali 400MP4 266MHz 旧固件 Mali 400MP4 399MH
  • 【Web Crawler】Scrapy vs BeautifulSoup:哪个是您业务的最佳选择?

    Beautiful Soup 可以帮助从目标网页中提取特定元素 而 Scrapy 可以管理异步数据检索 从而提高效率 不确定哪个选项最适合您的业务需求 本指南可以提供帮助 什么是Beautiful Soup Beautiful Soup 是
  • 数据挖掘——决策树和K近邻

    决策树和K近邻 一 线性回归 房价预测 第1关 线性回归算法思想 一 相关知识 1 gt 简单线性回归 2 gt 多元线性回归 二 编程要求 三 参考答案 第2关 动手实现线性回归 一 相关知识 1 gt 数据集介绍 2 gt 线性回归算法
  • android蓝牙支持双向,【玩机攻略】了解蓝牙LDAC,玩转双向蓝牙LDAC

    原标题 玩机攻略 了解蓝牙LDAC 玩转双向蓝牙LDAC LDAC是由SONY开发的一项蓝牙音频编码技术 它的最高传输速率可达990kbps 相当于普通蓝牙的3倍 文件采样率最高可支持96 khz 而即使是aptX HD 其最高所能支持的文
  • Windows 在CMD 终端中使用SS代理

    打开CMD后先分别输入下面两条命令 set http proxy 127 0 0 1 1080 set https proxy 127 0 0 1 1080 其中的本地IP 地址和端口号如果你没有改过的话应该是没问题的 改过的话就填改过的
  • 新版-C语言学生信息管理系统

    拥有基本的学生信息系统的功能 功能点如下所示 1 添加学生信息 2 修改学生信息 3 删除学生信息 4 查看学生信息 5 搜索学生信息 6 查看系统学生总人数 7 学生信息排序 8 保存学生信息 保存在D students txt 9 导入
  • C++ string类型的字符串长度获取的三种方法

    1 用string的成员方法length 获取字符串长度 length 比较直观 表示的就是该字符串的长度 cpp
  • 【踩坑篇】代码中使用 Long 作为 Map的Key存在的问题

    本周的工作结束 详述一些在项目代码中实际遇到的一些坑 代码中遇到这样一个场景 有个业务接口 接口返回的值是一个JSON格式的字符串 通过JSON解析的方式 解析为格式为 Map
  • 在STM32CubeIDE中使用IAR编译器

    在STM32CubeIDE中使用IAR编译器 一 前言 IAR编译器的大名早有耳闻 但本人一直未深度使用 主要有以下三点原因 首先 它收费 因此笔者更倾向于使用免费的GCC工具链 其次 作为嵌入式开发来说 IAR封装了太多底层细节 要深入了
  • Android开发学习笔记:Service的简介和启动方式

    一 Service的简介 1 Service 介绍和作用 Service是Android系统中的四大组件之一 它是一种长生命周期的 没有可视化界面 运行于后台的一种服务程序 比如我们播放音乐的时候 有可能想边听音乐边干些其他事情 当退出播放
  • 什么是实体-联系图(ER图)

    实体 联系图 ER图 数据模型中包含3种相互关联的信息 数据对象 数据对象的属性及数据对象彼此间相互连接的关系 1 数据对象 数据对象是对软件必须理解的复合信息的抽象 所谓符合信息是指具有一系列不同性质或属性的事物 仅有单个值得事物 例如
  • 安天逆向教程——常用汇编语句

    一 汇编基础 二 条件分支 反汇编时更多关注这些条件分支 如果看懂这些条件分支 会对程序的大体逻辑有一个整体的了解 至于程序里面的细节 有时会省略掉 往往关键的跳转理解了甚至进行一点点的改动 就会使得程序发生翻天覆地的变化 三 栈和函数调用
  • PO模式-unittest

    PO模式是指将页面元素的定位以及元素的操作分离出来 测试用例脚本直接调用这些封装好的元素操作来组织测试用例 从而实现了测试用例脚本和元素定位 操作的分离 本文采用PO模式和unittest框架 对readmine系统执行了两条测试用例 文件