自动化测试框架[Cypress PO模式]

自动化测试框架[Cypress PO模式]【附源码】在Cypress中并不认为PO是个很好的模式,Cypress认为跨页面共享逻辑是一个反模式(Anti-Pattern),在Cypress中,它提供了很多方式,允许用户通过更简单的方式直接设置被测应用程序达到的待测试状态,不需要再不同页面一遍又一遍的执行相通操作

大家好,又见面了,我是你们的朋友全栈君。

Cypress的PO模型

将元素定位器剥离

首先在工程的Cypress路径下新建一个pages目录,然后在该目录下新建一个JS文件,并命名为login.js

//login.js
export default class LoginPage{ 
   
	constructor(){ 
   
		this.userName='input[name=username]'
		this.password='input[name=password]'
		this.form='form'
		this.url='http://localhost:7077/login'
	}
	isTargetPage(){ 
   
		cy.visit('/login')
		cy.url().should('eq', this.url)
	}
	login(username, password){ 
   
		cy.get(this.userName).type(username)
		cy.get(this.password).type(password)
		cy.get(this.form).submit()
	}
}

然后在Cypress路径下的integration路径下新建一个JS文件,并命名为testLogin.js

//testLogin.js
/// <reference types="cypress" />
import LoginPage from "../pages/login"
describe('登录测试,PageObject模式', function () { 
   
    const username = 'davie.yang'
    const password = 'yangdawei'
    it('登录成功', function () { 
   
    	// 创建pageobject实例
        const loginInstance = new LoginPage()
        loginInstance.isTargetPage()
        loginInstance.login(username, password)
        cy.url().should('include', '/dashboard')
    })
})

改造login.js

//login.js
export default class LoginPage{ 
   
	constructor(){ 
   
		this.userNameLocator='input[name=username]'
		this.passwordLocator='input[name=password]'
		this.formLocator='form'
		this.url='http://localhost:7077/login'
	}
	get username(){ 
   
		return cy.get(this.userNameLocator)
	}
	get password(){ 
   
		return cy.get(this.passwordLocator)
	}
	get form(){ 
   
		return cy.get(this.formLocator)
	}
	isTargetPage(){ 
   
		cy.visit('/login')
		cy.url().should('eq', this.url)
	}
	login(userName, passWord){ 
   
		this.username.type(userName)
		this.password.type(passWord)
		this.form.submit()
	}
}

在pages路径下新建JS文件,并命名为mainPage.js

//mainPage.js
export default class mainPage{ 
   
	constructor(){ 
   
		this.h1Locator='h1'
		this.url='http://localhost:7077/dashboard'
	}
	get welComeText(){ 
   
		return cy.get(this.h1Locator)
	}
	isTargetPage(){ 
   
		cy.url().should('eq', this.url)
	}
}

更新testLogin.js文件,验证登陆成功后跳转到mainPage页面

//testLogin.js
/// <reference types="cypress" />
import LoginPage from "../pages/login"
import mainPage from "../pages/mainPage"
describe('登录测试,PageObject模式', function () { 
   
    const username = 'davie.yang'
    const password = 'yangdawei'
    it('登录成功', function () { 
   
        const loginInstance = new LoginPage()
        loginInstance.isTargetPage()
        loginInstance.login(username, password)
        cy.url().should('include', '/dashboard')
        const mainInstance = new mainPage()
        mainInstance.isTargetPage()
        mainInstance.welComeText.should('contain', 'davie.yang')
    })
})

进一步更新,将每个页面都公用的部分再次剥离,在pages路径下新建一个JS文件,并命名为commonPage.js

//commonPage.js
export default class CommonPage { 
   
    constructor() { 
   
        //构造函数,可以为空。
        //如果不为空,应该是所有 page 都会用到的变量。
    }
    isTargetPage() { 
   
        cy.url().should('eq', this.url)
    }

}

然后更新login.js文件

//login.js
import CommonPage from './commonPage'
export default class LoginPage extends CommonPage { 
   
    constructor() { 
   
        super()
        this.userNameLocator = 'input[name=username]'
        this.passwordLocator = 'input[name=password]'
        this.formLocator = 'form'
        this.url = 'http://localhost:7077/login'
    }
    get username() { 
   
        return cy.get(this.userNameLocator)
    }
    get password() { 
   
        return cy.get(this.passwordLocator)
    }
    get form() { 
   
        return cy.get(this.formLocator)
    }
    visitPage() { 
   
        cy.visit('/login')
    }
    login(userName, passWord) { 
   
        this.username.type(userName)
        this.password.type(passWord)
        this.form.submit()
    }
}

更新pages文件夹下的mainPage.js文件

import CommonPage from './commonPage'

export default class mainPage extends CommonPage { 
   
    constructor() { 
   
        super()
        this.h1Locator = 'h1'
        this.url = 'http://localhost:7077/dashboard'
    }
    get welComeText() { 
   
        return cy.get(this.h1Locator)
    }
}

到此一个PO模式实现完毕

Cypress的PO模式弊端

如果一个测试需要访问多个页面对象,这就意味着测试过程中需要初始化多个页面对象的实例,如果大多数页面对象需要 登陆才能访问,则每次初始化都需要先登录再访问,因为只有登陆后才能重用cookie,这无疑会增加测试执行的时间

因此在Cypress中并不认为PO是个很好的模式,Cypress认为跨页面共享逻辑是一个反模式(Anti-Pattern),在Cypress中,它提供了很多方式,允许用户通过更简单的方式直接设置被测应用程序达到的待测试状态,不需要再不同页面一遍又一遍的执行相通操作,这个更简单的方式就是***Custom Commands***

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137793.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • rocketmq启动报错VM warning: INFO: OS::commit_memory(0x00000006c0000000, 2147483648, 0) faild

    rocketmq启动报错VM warning: INFO: OS::commit_memory(0x00000006c0000000, 2147483648, 0) faild解决方案:修改/RocketMQ/devnev/bin/下的服务启动脚本runserver.sh、runbroker.sh中对于内存的限制,​改一下内存大小就行了:JAVA_OPT=”${JAVA_OPT}-server-Xms128m-Xmx128m-Xmn128m-XX:PermSize=128m-XX:MaxPermSize=128m”…

    2022年5月14日
  • 怎么完全卸载赛门铁克_赛门铁克专用卸载工具[通俗易懂]

    怎么完全卸载赛门铁克_赛门铁克专用卸载工具[通俗易懂]安装卸载是两个操作,完全相反,通常安装会比卸载简单,赛门铁克专用卸载工具是一款专门用于卸载赛门铁克系列软件的应用工具,赛门铁克专用卸载工具完美解决赛门铁克怎么卸载的难题,需要的用户可以下载!赛门铁克官方卸载工具相关说明:包括SymantecAntiVirus即SAV系列,SymantecClientSecurity即SCS系列,以及SymantecEndpointProtection即S…

    2022年4月29日
  • 京东自助代挂_京东任务代挂

    京东自助代挂_京东任务代挂京东自动签到-代挂效果展示说明效果展示说明JD签到网站:点我进入京东签到网站    JD签到,东东农场等活动自动帮做,每天都会自动浇水。每天都有200-1000豆豆不等入账,相当于坐等收钱,JD只要出了新活动网站都会同步更新,不需要担心任何活动,每天都会帮你自动完成。…

    2022年9月16日
  • 美化包软件_美化桌面的软件

    美化包软件_美化桌面的软件前言在我们进行自动化测试的时候,用例往往是成百上千,执行的时间是几十分钟或者是小时级别。有时,我们在调试那么多用例的时候,不知道执行到什么程度了,而pytest-sugar插件能很好解决我们的痛点。

    2022年7月31日
  • 数据挖掘选择题_数据挖掘算法例题

    数据挖掘选择题_数据挖掘算法例题目录一、填空题二、计算题一、填空题❃随着信息技术的高速发展,数据库应用的规模、范围和深度不断扩大,网络环境成为主流等等。产生“数据丰富而信息贫乏”现象。❃“数据丰富而信息贫乏”现象导致大数据概念。❃数据(Data)、信息(Information)和知识(Knowledge)是广义数据表现的不同形式。❃大数据时代的数据挖掘技术需求分析的流派:数据论、方法论、环境论、特征论…

    2022年9月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号