自动化测试框架[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)
上一篇 2022年6月1日 下午12:46
下一篇 2022年6月1日 下午12:46


相关推荐

  • PyCharm Runtime Error R6034解决方法——补充(彻底解决)

    PyCharm Runtime Error R6034解决方法——补充(彻底解决)文章目录前言注意事项具体操作前言笔者最初参考了一篇比较能说明问题的文章 链接如下 PyCharmRunti 解决方法 这里使用 ProcessExplo 来解决问题 相关的下载和使用方法在上面已经有比较好的说明 我就不再赘述了 但有问题需要特别注意 要不然解决不了问题 注意事项 ProcessExplo 这个工具需要一直打开 没必要管理员权限 当启动了 Pycharm 并报错时 ProcessExplo 便会检测出来错误 Pycharm 这个 Runt

    2026年3月18日
    2
  • 小米解bl锁跳过168小时_xiaomi redmi 红米秒解BL工具分享支持小米红米机型秒解BL跳过168小时[通俗易懂]

    小米解bl锁跳过168小时_xiaomi redmi 红米秒解BL工具分享支持小米红米机型秒解BL跳过168小时[通俗易懂]目前小米的新机,官方风控都默认绑定7天也就是168小时才能解锁BL,部分账号需要绑定15天才能满足条件,导致很多爱玩机的小伙伴被拒门外。并不是所有人都愿意等待官方解锁时候,而跳过168小时解锁,也成为了很多小伙伴希望的事情。本工具来自ROM乐园技术大神分享,经测试部分版本可秒解BL,无需等待,但并不是百分百才能成功。如果你官方工具解锁失败,不妨试试这个解锁工具,建议更换1个小米账号,再使用此工具解锁BL看看————————————————unlockBootloaderxiaomi…

    2022年6月6日
    220
  • iscsiadm命令详解_iscsi 局域网

    iscsiadm命令详解_iscsi 局域网启动iscsi守护进程serviceiscsistart发现目标iscsiadm-mdiscovery-tsendtargets-p192.168.1.1:3260-mdiscovery指定模式为discovery-p192.168.1.1:3260指定目标ip和端口登入节点iscsiadm-mnode–Tiqn.19…

    2022年8月23日
    10
  • java static关键字的作用是什么_java中的static关键字

    java static关键字的作用是什么_java中的static关键字一、static代表着什么在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块。Java把内存分为栈内存和堆内存,其中栈内存用来存放一些基本类型的变量、数组和对象的引用,堆内存主要存放一些对象。在JVM加载一个类的时候,若该类存在static修饰的成员变量…

    2022年7月8日
    19
  • java 随机数算法_Java随机数算法原理与实现方法实例详解

    java 随机数算法_Java随机数算法原理与实现方法实例详解本文实例讲述了Java随机数算法。分享给大家供大家参考,具体如下:软件实现的算法都是伪随机算法,随机种子一般是系统时间在数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次,即形如:ax≡b(modn)的方程。此方程有解当且仅当b能够被a与n的最大公约数整除(记作gcd(a,n)|b)。这时,如果x0是方程的一个解,那么所有的解可以表示为:{x0+k…

    2022年7月26日
    14
  • 2020最新版Net加壳工具

    2020最新版Net加壳工具VirboxProtector发布最新版本Net加壳工具:VirboxProtector2.VirboxProtector为.NETFramework编写的软件做代码保护,防止代码被反编译,防止IL代码在内存被Dump。同时可配合授权产品实现软件的许可管理。加密技术VirboxProtector.NET版通过多种保护方式来防止反编译,加密后可让任何现有工具都无法反编译。JIT加密将.NET所有方法的IL指令经过加密,仅在.NET虚拟机进行J.

    2022年6月27日
    83

发表回复

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

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