页面驱动page object model
页面驱动(Page Object Model)
页面对象(Page Object)
属性:所有在该页面的测试操作中所会用到的元素对象。比如在登录测试操作中,我们会用到用户名、密码、验证码以及登录按钮这几个页面元素,所以这几个页面元素就是登录页面这个页面对象的属性
方法:所有在该页面能执行的跟测试相关的操作,我们会封装为该页面对象的方法
使用页面对象主要目的是代码复用
测试场景:
登录:有效登录、无效登录
会员管理:需要先登录再来操作会员管理的测试
如果使用传统的测试代码编写方法(不使用PO模型)会导致两个问题:
1.代码量大,无法复用代码,代码编写效率很低
2.代码维护困难,一旦元素属性发生修改,所有涉及该元素的代码都需要改
base_page.py
class BasePage:def __init__(self,driver):self.driver = driverdef find_element(self,*loc):#loc=(id,username)return self.driver.find_element(*loc)def find_elements(self,*loc):return self.driver.find_elements(*loc)'''如果有其他的基本操作,可以继续封装'''
login_page.py
from pages.base_page import BasePage
from selenium.common.exceptions import NoSuchElementExceptionclass LoginPage(BasePage): #定义登录页面对象的属性和方法username=('id','username')password=('id','password')login_btn=('xpath','//input[contains(@onclick,"Login()")]')msg=('id','loginName')def login_action(self,un,pw):self.find_element(*self.username).send_keys(un)self.find_element(*self.password).send_keys(pw)self.find_element(*self.login_btn).click()def check_login_status(self):try:message=self.find_element(*self.msg).textexcept NoSuchElementException:print("============login failed================")return Falseelse:if 'admin' in message:print("============文本验证成功================")return Trueelse:print("============文本验证失败================")return False
Myunit.py
import unittest
from selenium import webdriverclass Myunit(unittest.TestCase):def setUp(self) -> None:self.driver=webdriver.Chrome()self.driver.get('http://localhost:8080/mms')def tearDown(self) -> None:self.driver.quit()
test_login.py
from common.myunit import Myunit
from pages.login_page import LoginPageclass LoginTest(Myunit):def test_login_success(self):lp=LoginPage(self.driver)lp.login_action('admin','admin123')self.assertTrue(lp.check_login_status())def test_login_failed(self):lp=LoginPage(self.driver)lp.login_action('','admin123')self.assertFalse(lp.check_login_status())
mms.py
import unittest
import time
from selenium import webdriver
class MMS(unittest.TestCase):def setUp(self) -> None:self.driver=webdriver.Chrome()self.driver.get('http://localhost:8080/mms')def tearDown(self) -> None:self.driver.quit()def test_login_success(self):self.driver.find_element('id', 'username').send_keys('admin')self.driver.find_element('id', 'password').send_keys('admin123')self.driver.find_element('xpath','//input[contains(@onclick,"Login()")]').click()time.sleep(2)result=self.driver.find_element('id','loginName').textself.assertTrue('admin' in result)def test_login_failed(self):self.driver.find_element('id', 'username').send_keys('')self.driver.find_element('id', 'password').send_keys('admin123')self.driver.find_element('xpath', '//input[contains(@onclick,"Login()")]').click()
mms_page.py
import timefrom pages.base_page import BasePageclass MMSPage(BasePage):phone=("id","customerphone")name=("id","customername")add_btn=("xpath","//button[@onclick='addCustomer()']")search_btn=("xpath","//button[contains(@onclick,'searchCustomer')]")result_list=("xpath","//tbody[@id='customerlist']/tr")member_manage_link=('link text','会员管理')def goto_member_manage(self):self.find_element(*self.member_manage_link).click()def add_action(self,phone,name): #新增会员操作self.find_element(*self.phone).send_keys(phone)self.find_element(*self.name).clear()self.find_element(*self.name).send_keys(name)self.find_element(*self.add_btn).click()def check_add_action(self,phone):self.find_element(*self.phone).clear()self.find_element(*self.phone).send_keys(phone)time.sleep(1)self.find_element(*self.add_btn).click()time.sleep(1)results=self.find_elements(*self.result_list)if results>1:return Trueelse:return False
test_member.py
from common.myunit import Myunit
from pages.mms_page import MMSPage
from pages.login_page import LoginPage
class Member(Myunit):def test_add_member_success(self):lg=LoginPage(self.driver)lg.login_action('admin','admin123','0000')mms=MMSPage(self.driver)mms.goto_member_manage()mms.add_btn('13277777777','tester2')self.assertTrue(mms.check_add_action('13277777777'))
页面驱动page object model相关推荐
- Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)
Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python) 研究Selenium + python 自动化测试有近两个月了,不能说 ...
- Appium+Python之PO模型(Page object Model)
思考:我们进行自动化测试时,如果把代码都写在一个脚本中,代码的可读性会变差,且后期代码维护也麻烦,最好的想法就是测试对象和测试用例可以分离,可以很快定位问题,代码可读性高,也比较容易理解.这里推荐大家 ...
- Python+Selenium自动化测试:Page Object模式
Page Objects是selenium的一种测试设计模式,主要将每个页面看作是一个class.class的内容主要包括属性和方法,属性不难理解,就是这个页面中的元素对象,比如输入用户名的输入框,输 ...
- 页面驱动开发(Page Driven) —— 一种大多数人还不认同的技术
---------- 前言 ---------- 极限编程为什么不极限?我们已经按照教科书.Jcobson.MatinFowler的做了,用了测试驱动,用了小卡片,用了standmeeting,可是结 ...
- 【转载】Selenium使用Page Object实现页面自动测试
点击这里查看原文 ======================================= Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Clas ...
- Page Object设计模式实践
Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可 ...
- python+ seleniumAPPium自动化 page Object 设计模式
题记: 之前公司项目比较稳定, 在进行了系统测试,想用自动化测试进行冒烟测试,或者对主要功能进行测试, 因此用到了PO模式 因此做个记录: Page Object Page Object模式是使用Se ...
- MOSS 2010:Visual Studio 2010开发体验(19)——ECMAScript Object Model
这篇文章部分材料摘自下面这个地址,我做了翻译,并且按照我的案例场景做了补充 http://www.codeproject.com/Articles/60348/SharePoint-2010-Clie ...
- 关于page object(PO)模型的介绍
所谓的PO就是page object,通俗解释一下就是每个页面当成一个对象,给这些页面写一个类,主要就是完成元素定位和业务操作:至于测试脚本要和ta区别开来,需要什么去这些页面类去调用即可.这样的好处 ...
最新文章
- Bzoj1002 [FJOI2007]轮状病毒
- python游戏最简单代码-如何利用Python开发一个简单的猜数字游戏
- vue实现查询多条记录_sql:多表查询
- 【Linux】一步一步学Linux——sort命令(53)
- Java最佳实践–高性能序列化
- stl之multimap容器
- 4一20ma电流有源与无源区别_一文读懂有源信号、无源信号、干接点、湿接点
- linux系统上查询ip地址归属
- android逆向工程dex2jar使用
- I2C详解(2) I2C总线的规范以及用户手册(1) I2C 总线协议
- erp软件涉及哪些计算机技术?,ERP软件应该学习哪些内容?
- USB 大容量存储设备的开发
- goahead(嵌入式Web服务器)之asp、goform篇
- matlab 元素 最大值和最小值,[转载]matlab中的最大值和最小值
- 几种镜像恒流源电路分析!
- java POI导出excel,导出的excel,打开文件提示文件格式或扩展名无效
- win7开不了机按f8修复计算机没反应,win7开不了机按f8没用怎么办
- 压缩软件大比拼历史回顾:ZIP与RAR
- 微信开发者.js.json_非中国开发者如何利用微信的1.1B每月活跃用户
- kali linux怎么远程桌面,适用于kali linux的远程桌面开启方法(从windows xp 远程登录到kali linux )...
热门文章
- Transformer及其变种
- 鲁中职业学院计算机平面设计,鲁中职业学院17名学生春季高考免试直升本科
- 【数据聚类|深度聚类】Contrastive Clustering(CC)论文研读
- 非科班出身,工作 10 年,我从 2800 到如今年薪 200 万
- 16:9显示器与4:3显示器的显示高度关系 -- 0.82
- 高级定时器TIM1TIM8工作原理和功能
- 【问】结算时报错,提示“传递给系统调用的数据区域太小”,如何解决?
- imx6ull_SPI
- 园区动态 || 热烈欢迎金牛区五块石街道党群办一行莅临园区考察交流
- noj1042 -电子老鼠闯迷宫