Cypress 简明教程
Cypress - Introduction
Cypress 是一款开源的免费自动化测试工具,从长远来看可以广泛使用。主要用于前端测试自动化。该工具主要开发用于解决团队在应用程序自动化过程中遇到的问题。
Cypress 有助于实现以下目标 −
-
Configure tests.
-
Configure tests.
-
Execute tests.
-
Identify errors (if any).
Selenium 和 Cypress 经常在功能方面进行比较。但是,Cypress 在架构和特性方面有所不同。此外,它解决了我们在 Selenium 中面临的一些问题。
Cypress 基于 JavaScript,并在浏览器中执行测试。它有助于开发包括以下内容的测试:
-
Unit tests.
-
End to end tests.
-
Integration tests.
Features
Cypress 的重要特性如下所示:
-
Supports Test-Driven development.
-
Provides Dashboard services.
-
使用生成堆栈跟踪和错误的开发人员工具进行有效的调试。
-
为失败的测试提供屏幕截图。
-
无需添加等待语句来在一段时间内停止执行。默认情况下,在执行以下步骤或断言之前应用等待语句。
-
能够监控和控制服务器响应、功能和计时器的特性,这对于单元测试来说必不可少。
-
检查和管理网络流量。
-
Allows the multi-browser support.
-
提供了用于捕获执行视频的内置功能。
-
可以与持续集成工具集成。
-
具有视窗大小调整的页面响应能力。
-
默认情况下,重新加载应用于测试的更改。
-
提供了友好的应用程序编程接口 (API)。
-
可以使用测试运行器,该运行器允许直接从用户界面 (UI) 执行测试。
Cypress - Architecture and Environment Setup
Cypress 架构如下图所示 −
Selenium 等自动化工具通过在浏览器外部运行来工作。然而,Cypress 具有不同的架构。它在浏览器内部运行。Cypress 基本上基于服务器。Node.js。
Cypress 与 Node.js 有着持续的交互,它们相互协调地工作。因此,Cypress 可用于测试应用程序的前端和后端。
如此,Cypress 既能够处理在 UI 上进行的实时任务,同时还能够执行浏览器外部的动作。
Difference between Cypress and Selenium
Cypress 与 Selenium 之间的基本区别如下所列 −
Cypress |
Selenium |
它基于 Javascript。 |
它基于 Java、C#、Python 和 JavaScript。 |
它具有较小的社区支持 |
它具有强大的社区支持。 |
它包括一个内置的视频捕捉功能。 |
没有内置的视频捕捉功能。 |
没有可以处理标签页/子窗口的 API。 |
有 API 可用于处理标签页/子窗口。 |
不能执行并行执行。 |
可以执行并行执行。 |
只需要安装 npm。 |
需要将补充的 jar、库等作为项目依赖项添加。 |
Cypress Environment Setup
有关 Cypress 环境设置,请访问链接-@ {s12}。将出现的屏幕如下所示 -
将同时提供 Windows 和 macOS 安装程序。我们必须根据本地操作系统获取软件包。
对于 64 位 Windows 配置,会弹出以下窗口提示保存安装程序。
安装完成后,程序文件中将创建一个 nodejs 文件。记下该文件的路径。然后,如下所示从“开始”处输入环境变量 −
在“系统属性”弹出窗口中,转到“高级”,单击“环境变量”。然后单击确定。
在“环境变量”弹出窗口中,转到“系统变量”部分并单击“新建”。
在“新建系统变量”弹出窗口中,分别在“变量名”和“变量值”字段中输入 NODE_HOME 和 node.js 路径(前面已记录)。
设置 node.js 文件的路径后,我们将在任何所需位置创建一个空文件夹(比如 cypressautomation)。
接下来,我们需要一个 JavaScript 编辑器来编写 Cypress 的代码。为此,我们可以从链接 [role="bare"] [role="bare"]https://code.visualstudio.com/ 下载 Visual Studio Code。
根据本地操作系统选择正确的包 −
下载可执行文件并完成所有安装步骤后,Visual Studio Code 将启动。
从“文件”菜单中选择“打开文件夹”选项。然后,将 CypressAutomation 文件夹(我们之前创建的)添加到 Visual Studio Code。
我们需要使用以下命令从终端创建 package.json 文件 −
我们必须输入包名称、描述等详细信息,如下面给出的图像中所示 −
npm init
完成后,package.json 文件将使用我们提供的信息在项目文件夹中创建。
完成后,package.json 文件将使用我们提供的信息在项目文件夹中创建。
最终,要安装 Cypress,运行下面给出的命令 -
npm install cypress --save-dev
你将获得以下输出 -
Cypress - Test Runner
Cypress Test Runner 有助于触发测试执行。当我们完成 Cypress 安装后,该工具在终端上提出了建议,如下所示 -
You can open Cypress by running − node_modules/.bin/cypress open
要打开 Test Runner,我们必须运行下面提到的命令 -
node_modules/.bin/cypress open
一段时间后,“测试运行器”窗口将打开,显示一条消息,即 Cypress 在 examples 文件夹中提供了示例项目文件夹结构。
单击“确定,我知道了!”按钮。然后,计算机上将显示如下屏幕:
然后,测试运行器将启动,其中 examples 文件夹下提供了一个以上的 spec 文件,如下所示:
要运行特定文件,例如 test2.spec.js,我们必须单击它。此外,还提供了浏览器和停止执行的选项。
执行应当从以下屏幕开始,显示测试步骤、测试用例名称、测试套件、URL、测试持续时间、浏览器尺寸,等等。
Cypress - Build First Test
一旦 Cypress 配置完毕,就会在项目内创建一个框架,该框架在 Explorer 中自动可见。新的测试文件(比如 FirstTest.spec.js)应在 integration 文件夹中创建,如下所示。
Cypress Folder Structure
让我们了解 Cypress 中的文件结构。Cypress 文件夹中包含的因素如下所述:
-
fixtures - 此处维护测试作为键值对形式的测试数据。
-
integration - 此处维护框架的测试用例。
-
plugins - 此处维护 Cypress 事件(测试前和测试后执行的事件)。
-
support - 此处创建可重用方法或自定义命令,测试用例可以直接利用它们,而不进行对象创建。
-
videos - 以视频的形式记录执行的测试步骤,并在此处维护。
-
node_modules - 此文件夹维护 npm 的项目依赖项。它是 Cypress 项目执行的核心。
-
cypress.json - 此文件夹中设置了默认配置。可以在此处修改当前配置的值,这将覆盖默认配置。
-
package.json - 此文件夹维护项目的依赖项和脚本。
Structure of a Basic Test
Cypress 遵循 JavaScript 测试框架(Mocha、Jasmine 等)。要在 Cypress 中创建测试,我们必须遵守以下框架准则:
-
测试套件名称必须在 describe 函数内提供。
-
测试套件内的测试用例名称必须在相同函数内提供,或者您必须指定该函数。
-
测试用例内的测试步骤必须在 it/specify 代码块内实现。
Basic Test Implementation
基本的测试执行可以通过使用如下命令完成:
// test suite name
describe('Tutorialspoint Test', function () {
// Test case
it('Scenario 1', function (){
// test step for URL launching
cy.visit("https://www.google.com/");
});
});
上面使用的cy命令不需要对象调用。它在默认安装节点模块时是可用的。
Test Execution
对于执行 from the command line ,运行下面给出的命令:
./node_modules/.bin/cypress run
这里,集成文件夹内的所有文件都会被触发。
对于执行 from the Test Runner ,运行下面给出的命令:
./node_modules/.bin/cypress open
然后,点击我们要触发执行的说明文件。
要触发执行 for a specific file from command line ,运行下面给出的命令:
cypress run --spec "<spec file path>"
以下屏幕将出现在您的计算机上:
Cypress - Supported Browsers
Cypress可以在Chrome、Electron和Firefox等浏览器中运行测试。在测试运行器中,我们可以在右上角选择浏览器。
另外,必须注意的是,如果浏览器选项不可用,这意味着我们的系统中没有最新版本的浏览器。
Execution from Other Browsers
下面解释了从命令行从其他浏览器执行:
要运行 execution in Chrome ,您需要运行下面提到的命令:
./node_modules/.bin/cypress run -- browser chrome
您会看到以下画面:
要运行 execution in Firefox ,运行下面给出的命令:
./node_modules/.bin/cypress run -- browser firefox
您会看到以下画面:
要运行 execution in headed mode ,运行下面给出的命令:
./node_modules/.bin/cypress run -- headed
从命令行,如果未指定选项,Cypress将在无头模式下执行测试。
Cypress - Basic Commands
基本的Cypress命令如下:
and
它用于创建断言,是.should()的别名。
用法如下:
//element is visible & enabled
cy.get('#txt').should('be.visible').and('be.enabled')
//element is checked
cy.contains('Subject').and('be.checked')
check
它选中单选按钮或复选框,并应用于拥有 input 标签的元素。
用法如下:
//checks element having class attribute chkbox
cy.get('.chkbox').check()
click
它点击 Document Object Model (DOM) 中的元素。
用法如下:
//click on element with id txt
cy.get('#txt').click()
contains
它获得具有特定文本的元素。元素可以拥有比文本更多内容并且仍然匹配。
用法如下:
//returns element in #txt having Tutor text
cy.get('#txt').contains('Tutor')
dblclick
它双击 Document Object Model (DOM) 中的元素。
用法如下:
//double clicks element with id txt
cy.get('#txt').dblclick()
go
在浏览器历史记录中向前或向后移动到下一个或上一个 URL。
用法如下:
//like clicking back button
cy.go('back')
//like clicking forward button
cy.go('forward')
next
它获取文档对象模型 (DOM) 中元素组中元素的直接同级元素。
用法如下:
//gives the following link in element l.
cy.get('l a:first').next()
Cypress - Variables
在 Cypress 中,使用了诸如 var、let 和 const 这样的变量。在使用闭包时,我们可以使用未经分配获得的对象。但是,当我们使用可变对象时,情况并非如此。
当一个对象修改其特性时,我们可能需要将它的之前值与新值进行比较。
Code Implementation
我们可使用下面提到的命令来实现代码 −
cy.get('.btn').then(($span) => {
// value capture before button click and stored in const
const n = parseInt($span.text())
cy.get('b').click().then(() => {
// value capture after button click and stored in const
const m = parseInt($span.text())
// comparison
expect(n).to.eq(m)
})
})
在上述情况下,我们使用 const 变量,因为对象 $span 正在发生变化。在处理可变对象及其值时,建议使用类型为 const 的变量。
Cypress - Aliases
Cypress 别名是一个重要的组件,有多种用途。这些用途如下所列 −
Sharing Context
我们必须使用 .as() 来标记我们必须共享的内容。要标记对象和基元,Mocha 上下文对象被使用。可以用 this.* 访问别名对象。
默认情况下,Mocha 为适用于测试的所有钩子共享上下文,并清除测试执行后的别名属性。
describe('element', () => {
beforeEach(() => {
cy.wrap('eleone').as('x')
})
context('subelement', () => {
beforeEach(() => {
cy.wrap('eletwo').as('y')
})
it('aliases properties', function () {
expect(this.x).to.eq(' eleone ')
expect(this.y).to.eq(' eleone ')
})
})
})
})
我们可以通过共享上下文来处理固定装置。我们还可以使用异步命令 cy.get(),通过 @ 符号(而不是使用 this.*)来访问别名。这是一个同步命令。
beforeEach(() => {
// alias fixtures
cy.fixture('users.json').as('u')
})
it('scenario', function () {
// '@' to handle aliases
cy.get('@u').then((u) => {
// access element argument
const i = u[0]
//verification
cy.get('header').should('contain', u.name)
})
})
Requests
别名可以与请求一起使用。我们可以标记一个请求并稍后使用它的属性。这可以按如下方式完成 −
cy.request('https://jsonplaceholder.cypress.io/comments').as('c')
// other implementations if any
cy.get('@c').should((response) => {
if (response.status === 404) {
// assertion
expect(response).to.have.property('duration')
} else {
// do something else
}
})
})
Cypress - Locators
Cypress 只支持级联样式表 (CSS) 选择器来识别元素。但是,它还可以借助“Cypress-Xpath”插件来处理 xpath。
我们来考虑一个 html 代码片段并了解一些 css 表达式的规则。
Rules of CSS expression
级联样式表 (CSS) 表达式的规则如下 −
-
带属性 ID 和标签名的语法为标签名#id − 这里,CSS 表达式应为 - input#gsc-i-id1。
-
带属性类和标签名的语法为标签名.类 − 这里,CSS 表达式应为 - input.gsc-input。
-
带任何属性值和标签名的语法为标签名[属性='值' − 这里,CSS 表达式应为 - input[title='search']。
-
带父项到子项遍历的语法为父项子项 − 这里,CSS 表达式应为 - tr td。
Cypress 提供了打开选择器演练场功能,我们可以从该演练场自动定位和识别元素。此功能位于测试运行器窗口中,在下图中突出显示。
单击打开选择器演练场时,一个箭头会变得可见。单击它并将其移动到我们必须识别的元素。CSS 表达式会填充在箭头右侧可用的字段 cy.get 中。
同时,元素会突出显示,如下所示 −
Cypress - Assertions
Cypress 拥有多种断言类型,这些类型来自不同的库,例如 Mocha、Chai 等等。断言类型分为显式和隐式。
Implicit Assertions
如果一个断言适用于链中从父命令获取的对象,则称为隐式断言。流行的隐式断言包括 .and/.should。
这些命令不能作为独立命令使用。通常,当我们必须对特定对象执行多个检查时,我们使用它们。
让我们通过下面的示例来说明隐式断言 −
// test suite
describe('Tutorialspoint', function () {
it('Scenario 1', function (){
// test step to launch a URL
cy.visit("https://www.tutorialspoint.com/videotutorials/index.php")
// assertion to validate count of sub-elements and class attribute value
cy.get('.toc chapters').find('li').should('have.length',5)
.and('have.class', 'dropdown')
});
});
Execution Results
输出如下 −
输出日志显示了使用 should 和命令获得的两个断言。
Explicit Assertions
如果一个断言适用于对象本身,则称为显式断言。流行的显式断言包括 assert/expect。
用于显式断言的命令如下 −
// test suite
describe('Tutorialspoint', function () {
// it function to identify test
it('Scenario 1', function (){
// test step to launch a URL
cy.visit("https://accounts.google.com")
// identify element
cy.get('h1#headingText').find('span').then(function(e){
const t = e.text()
// assertion expect
expect(t).to.contains('Sign')
})
})
})
Execution Results
输出如下 −
输出日志显示了使用 expect 命令直接应用于对象的断言。
Cypress 拥有默认断言,这些断言在内部处理,不需要专门调用。
以下是一些示例 −
-
cy.visit () − 期望页面以 200 状态码显示内容。
-
cy.request () − 期望远程服务器可用并发送响应。
-
cy.contains() - 预计 Web 元素及其属性在 DOM 中可用。
-
cy.get() - 预计 Web 元素在 DOM 中可用。
-
.find () − Expects the web element to be available in DOM.
-
.type () − Expects the web element to turn to a type able state.
-
.click () − Expects the web element to turn to a clickable state.
-
.its () − Expects for a web element property on the existing subject.
Cypress - Text Verification
text 方法可用于获取 web 元素的文本。还可以添加断言来验证文本内容。
Implementation with text()
以下是有关文本验证的 text() 实施命令:
// test suite
describe('Tutorialspoint', function () {
// it function to identify test
it('Scenario 1', function (){
// test step to launch a URL
cy.visit("https://accounts.google.com")
// identify element
cy.get('h1#headingText').find('span').then(function(e){
//method text to obtain text content
const t = e.text()
expect(t).to.contains('Sign')
})
})
})
Execution Results
输出如下 −
输出日志显示使用 text 方法获得的 SignIn 文本。
Implementation with text assertions
我们还可以借助以下命令在 web 元素文本上实现断言:
// test suite
describe('Tutorialspoint', function () {
// it function to identify test
it('Scenario 1', function (){
// test step to launch a URL
cy.visit("https://accounts.google.com")
// verify text with have.text
cy.get('h1#headingText').find('span').should('have.text','Sign in')
})
})
Execution Results
输出如下:
输出日志显示使用 should 断言完成的文本验证。
Cypress - Asynchronous Behavior
Cypress 源自 node.js,后者基于 JavaScript。Cypress 命令本质上是同步的,因为它们依赖于 node 服务器。异步流意味着测试步骤在执行时不依赖于其先前的步骤。
没有依赖,每个步骤都作为独立的标识符执行。尽管测试步骤按顺序排列,但单个测试步骤不考虑前一步骤的结果,而仅仅执行自身。
Example
以下是在 Cypress 中异步行为的一个示例:
// test suite
describe('Tutorialspoint', function () {
it('Scenario 1', function (){
// test step to launch a URL
cy.visit("https://accounts.google.com")
// identify element
cy.get('h1#headingText').find('span').should('have.text', 'Sign in')
cy.get('h1#headingText').find('span').then(function(e){
const t = e.text()
// get in Console
console.log(t)
})
// Console message
console.log("Tutorialspoint-Cypress")
})
})
Execution Results
输出如下 −
Promise
右键单击测试运行器,然后单击 Inspect,我们可以在控制台验证结果。此处, Tutorialspoint-Cypress (先前的步骤)在控制台登录,早于 Sign – in (稍后添加的步骤)。
Cypress 命令的设计方式是按照顺序执行每一步,而不是同时触发它们。但是,它们按顺序排列。因此,它使得流变得同步。这是通过 Promise 实现的。
在上面的示例中, console.log 是一个纯 JavaScript 语句。它没有像 Cypress 命令那样排队等待的能力。Promise 使我们可以以串行模式执行 Cypress 命令。
Modes in Promise
Promise 有三种模式来对命令执行的状态进行分类。它们如下:
-
Resolved - 如果测试步骤成功运行,则会出现此结果。
-
Pending - 如果正在等待测试步骤运行的结果,则这就是结果。
-
Rejected - 如果测试步骤运行不成功,则这就是结果。
仅在先前的步骤已成功执行或收到解析后的 promise 响应后,才会执行 Cypress 命令。然后,该方法用于在 Cypress 中实现 Promise。
Example
以下是在 Cypress 中 Promise 的示例:
describe('Tutorialspoint Test', function () {
it('Promise', function (){
return cy.visit('https://accounts.google.com')
.then(() => {
return cy.get('h1#heading');
})
})
})
Cypress 对 Promise 的实现是封装的,不可见的。因此,这有助于获得更紧凑的代码。此外,在自动化测试时,我们不必考虑 Promise 的状态。
Cypress - Working with XHR
XHR 是 XML HTTP Request。它是一个应用程序编程接口 (API),可用作对象,其方法在 Web 浏览器和服务器之间发送数据。XHR 中的对象可以请求以响应形式从服务器请求数据。
Cypress 不仅可以用于前端自动化,还可以通过直接访问 XHR 对象来控制网络流量。然后,它对该对象应用断言。它可以模拟或伪造响应。可以在浏览器的网络选项卡中查看 XHR 详细信息。
XHR 响应头的语法如下:
响应如下:
可以使用 cy.request() 命令执行 XHR 请求。cy.intercept() 方法用于将响应重定向到匹配的请求。
Cypress - jQuery
Cypress 不仅可以使用 get 方法来识别 Web 元素,还可以使用 JQuery 的对象及其方法以及其内部命令。虽然 Cypress 使用 get 方法来识别 Web 元素,但是 JQuery 使用 $() 方法用于相同目的。
在 Cypress 中,用于识别 Web 元素的命令如下所示——
cy.get('h1#heading')
而在 JQuery 中,用于识别 Web 元素的命令如下所示——
$('h1#heading')
Cypress 是基于异步特征的 JavaScript。但是,Cypress 命令通过在内部解析 Promise(最终用户不可见)同步执行。
但是,当 Cypress 对 JQuery 对象及其方法执行操作时,必须明确地实现 Promise 逻辑,以使得流程同步(借助方法 then)。
例如,当我们想要提取 Web 元素的文本内容(使用 JQuery 方法 - text)时,我们需要使用 then 方法实现 Promise。
Promise Implementation in jQuery
以下是 JQuery 中 Promise Cypress 实现的命令——
// test suite
describe('Tutorialspoint', function () {
// it function to identify test
it('Scenario 1', function (){
// test step to launch a URL
cy.visit("https://accounts.google.com")
// Promise implementation with then()
cy.get('h1#headingText').find('span').then(function(e){
//method text to obtain text content
const t = e.text()
expect(t).to.contains('Sign')
})
})
})
在 JQuery 中,如果提供的定位符与 DOM 中的任何 Web 元素不匹配,则返回一个空集合。
为了避免异常,建议验证 $() 产生的 JQuery 集合的长度。命令如下所示——
const e = $('#txt')
if (e.length > 0){
//proceed
}
但是,如果 DOM 中没有匹配的 Web 元素,则 Cypress 会自动转到重试模式,直到元素可用或超时,如下所示——
cy.get('#txt')
.then((e) => { //proceed working on element })
该方法会产生一个 Promise。此外,只有当一个 Web 元素与定位符匹配时,该 Promise 才处于已解决模式。如果 Promise 处于拒绝状态,则 then 块中的逻辑将永远不会执行。
我们可以在 Cypress 中通过以下表达式访问 JQuery 方法——
Cypress.$( '#txt'), where #txt is the locator.
Implementation of jQuery methods
以下是使用 JQuery 在 Cypress 中识别和执行测试的命令——
// test suite
describe('Tutorialspoint', function () {
// it function to identify test
it('Scenario 1', function (){
// test step to launch a URL
cy.visit("https://accounts.google.com")
// access web element with Cypress.$
cy.request('/').get('h1#headingText').then(function(e){
Cypress.$(e).find('span')
const t = e.text()
cy.log(t)
})
})
})
当执行上述测试时,如果我们打开控制台(按下 F12)并使用表达式 Cypress.$ ('h1#headingText').text() 查找必需的 Web 元素,我们可以验证测试,如下所示——
日志消息——登录——是从 Cypress 中的 cy.log 命令获得的。
Cypress - Checkbox
检查和取消检查命令用于处理复选框。在 html 代码中,复选框有一个 input 标签,其 type 属性的值为 checkbox。
Cypress Commands
与复选框相关的 Cypress 命令如下所示——
-
用于 click all the checkboxes 的命令如下所示——
cy.get('input[type="checkbox"]').check()
-
用来 click a checkbox with id check 的命令如下:
cy.get('#chk').check()
-
用来 click a checkbox with value Cypress 的命令如下:
cy.get('input[type="checkbox"]').check('Cypress')
-
用来 click the checkboxes with values - Java and Python 的命令如下:
cy.get('input[type="checkbox"]').check(['Java','Python'])
-
用来 click the checkbox having value Java with options 的命令如下:
cy.get('.chk').check('Java', options)
-
用来 click the checkboxes with values – Java and Python with options 的命令如下:
cy.get('input[type="checkbox"]').check(['Java','Python'], options)
-
用来 click the checkbox having class check with an option 的命令如下:
cy.get('.chk').check({force : true})
-
用来 uncheck all the checkboxes 的命令如下:
cy.get('input[type="checkbox"]').uncheck()
-
用来 uncheck a checkbox with id check 的命令如下:
cy.get('#chk').uncheck()
-
用来 uncheck the checkbox with value Cypress 的命令如下:
cy.get('input[type="checkbox"]').uncheck('Cypress')
-
用来 uncheck the checkboxes with values - Java and Python 的命令如下:
cy.get('input[type="checkbox"]').uncheck(['Java','Python'])
-
用来取消选择具有选项 Java 的复选框的命令如下:
cy.get('.chk').uncheck('Java', options)
-
用来 uncheck the checkboxes with values – Java and Python 和选项的命令如下:
cy.get('input[type="checkbox"]').uncheck(['Java','Python'], options)
-
用来 uncheck the checkbox having class check with an option 的命令如下:
cy.get('.chk').uncheck({force : true)
Options in Cypress
Cypress 中可用的选项如下:
-
log – Default value – true − 用于开启/关闭控制台日志。
-
timeout – Default value – defaultCommandTimeout(4000ms) − 用于在引发错误之前提供一个最长的等待时间。
-
force – Default value – false − 用于强制执行一个动作。
-
scrollBehaviour – Default value – scrollBehaviour(top) − 用于在执行命令之前将元素滚动到的视口的位置。
-
waitForAnimations – Default value – waitForAnimations(true) − 用于在运行命令之前,等待元素完成动画。
-
animationDistanceThreshold - Default value – animationDistanceThreshold (5) −这是元素的像素距离,应超过该距离才能达到动画要求。
勾选/取消勾选命令都要求与产生 DOM 元素的命令串联,而且可以将断言应用于这些命令。
Implementation of Cypress Commands
Cypress 中命令的实现如下所述−
// test suite
describe('Tutorialspoint', function () {
// it function to identify test
it('Scenario 1', function (){
// test step to launch a URL
cy.visit("https://accounts.google.com/signup")
//checkbox with assertion
cy.get('input[type="checkbox"]').check().should('be.checked')
//identify checkbox with class with assertion
cy.get('.VfPpkd-muHVFf-bMcfAe').uncheck().should('not.be.checked')
})
})
Execution Results
输出如下:
上述结果显示“显示密码”左侧的复选框,首先使用 check 命令选中(使用断言应进行验证)。
然后,使用 uncheck 命令取消选中(也使用断言应进行验证)。
Cypress - Tabs
Cypress 没有处理选项卡的具体命令。它在 jQuery 中有一个解决方法,通过它处理选项卡。在 html 代码中,由于 target 特性,链接或按钮会打开新选项卡。
如果 target 特性具有空白值,它会打开新选项卡。Cypress 使用 jQuery 方法 removeAttr,它由 invoke 命令调用。removeAttr 删除特性,该特性作为 invoke 方法的参数之一传递。
一旦删除 target=blank,链接/按钮就会在父窗口中打开。稍后,对其执行操作之后,我们可以使用 go 命令返回父 URL。
为此,Html 代码如下:
Implementation
下面是有关 Cypress 中选项卡的命令实现:
describe('Tutorialspoint', function () {
// test case
it('Scenario 1', function (){
// url launch
cy.visit("https://the-internet.herokuapp.com/windows")
// delete target attribute with invoke for link
cy.get('.example > a')
.invoke('removeAttr', 'target').click()
// verify tab url
cy.url()
.should('include', 'https://the-internet.herokuapp.com/windows/new')
// shift to parent window
cy.go('back');
});
});
Execution Results
输出如下 −
输出日志显示在父窗口中删除了 target 特性并启动了新选项卡。
Cypress - Dropdown
select 命令用于处理静态下拉列表。在 html 代码中,下拉列表具有 select 标记,下拉列表元素通过 option 标记名表示。
Dropdown Cypress Commands
与下拉列表相关的 Cypress 命令如下所示:
-
用于选择 the option Cypress 的命令如下所示:
cy.get('select').select('Cypress')
-
用于选择选项 Tutorialspoint 和 JavaScript 的命令如下所示:
cy.get('select').select(['Tutorialspoint', 'JavaScript'])
-
可以选择下拉选项的值以及选项 (to modify default characteristics) 的命令如下所示:
cy.get('select').select('option1', options )
-
用于选择 the multiple values with options 的命令如下所示:
cy.get('select').select(['option1', 'option2'], options)
Options for dropdown in Cypress
Cypress 中可用于下拉列表的选项如下所示:
-
log – Default value – true − 用于打开/关闭控制台日志。
-
timeout – Default value – defaultCommandTimeout(4000) − 用于在引发错误之前提供选择的最长等待时间。
-
force – Default value – false − 用于执行操作。
断言可以应用于 Cypress 中的 select 命令。
让我们尝试从下拉列表中选择选项 India ,该选项在 html 代码中的值为 99。
Implementation
在 Cypress 中选择选项印度的下拉命令实现如下所示:
// test suite
describe('Tutorialspoint', function () {
// it function to identify test
it('Scenario 1', function (){
// test step to launch a URL
cy.visit("https://register.rediff.com/register/register.php")
//select option India with value then verify with assertion
cy.get('select[id="country"]').select('99').should('have.value', '99')
})
})
Execution Results
输出如下 −
输出显示 Country 下拉列表选择选项 India(在 html 代码中,该选项的值标识为 99)。
Cypress - Alerts
Cypress 可以在缺省情况下处理警报。弹出窗口可能是警报或确认弹出窗口。Cypress 的设计方式是这样的,始终在弹出窗口中单击“确定”按钮。此外,Cypress 还有触发浏览器事件的能力。
警报由 window:alert event 触发。这在缺省情况下由 Cypress 处理,并且在执行过程中警报中的“确定”按钮被单击,且未显示。
但是,执行日志将显示该警报的存在。
Implementation Alerts
Cypress 中警报的实现如下−
describe('Tutorialspoint Test', function () {
// test case
it('Scenario 1', function (){
// launch url
cy.visit("https://register.rediff.com/register/register.php");
// click submit
cy.get('input[type="submit"]').click();
});
});
Execution Results
输出如下 −
警报信息显示在 Cypress 执行日志中。
Cypress 有通过使用 on 方法触发 window:alert 事件的能力。然后,我们可以验证警报文本。
但是,此事件将在后端发生,并且在执行过程中不会显示。
Implementation Alert text verification
以下是 Cypress 中警报文本验证的实现−
describe('Tutorialspoint Test', function () {
// test case
it('Scenario 1', function (){
// launch url
cy.visit("https://register.rediff.com/register/register.php");
// click submit
cy.get('input[type="submit"]').click();
// fire event with method on
cy.on('window:alert',(t)=>{
//assertions
expect(t).to.contains('Your full name');
})
});
});
Execution Results
输出如下:
输出日志显示成功验证了警报文本,该警报是由 Cypress 触发的警报事件产生的。
对于确认弹出窗口,触发浏览器事件 window:confirm。就像警报弹出窗口一样,Cypress 可以使用 on 方法触发此事件,并且在缺省情况下单击“确定”按钮。
Example
我们来看一下下面的示例。在此,单击“单击以获取 JS 确认”按钮时,会显示确认弹出窗口。
显示包含按钮 OK 和 Cancel 的以下确认弹出窗口。
单击“确定”按钮后,显示以下内容−
You clicked: Ok
将显示一个如下图所示的图像 −
点击 Cancel 按钮时,Result − 下方会显示以下内容:
You clicked: Cancel
将显示一个如下图所示的图像 −
Implementation Confirmation verification
以下给出了 cypress 中警报确认验证的实现:
describe('Tutorialspoint Test', function () {
// test case
it("Scenario 1", function () {
//URL launched
cy.visit("https://the-internet.herokuapp.com/javascript_alerts")
//fire confirm browser event and accept
cy.get(':nth-child(2) > button').click()
cy.on("window:confirm", (t) => {
//verify text on pop-up
expect(t).to.equal("I am a JS Confirm");
});
});
});
Execution Results
输出如下 −
Implementation Confirmation verification
以下给出了 cypress 中警报确认验证的实现:
describe('Tutorialspoint Test', function () {
// test case
it("Scenario 1", function () {
//URL launched
cy.visit("https://the-internet.herokuapp.com/javascript_alerts")
//fire confirm browser event and accept
cy.get(':nth-child(2) > button').click()
cy.on("window:confirm", (t) => {
//verify text on pop-up
expect(t).to.equal("I am a JS Confirm");
});
});
});
Execution Results
输出如下 −
输出日志显示成功验证确认文本,该文本是通过 cypress 激发的确认事件产生的。
Implementation Cancel click
在 cypress 中取消确认弹出窗口点击的实现如下:
describe('Tutorialspoint Test', function () {
// test case
it("Scenario 1", function () {
// URL launched
cy.visit("https://the-internet.herokuapp.com/javascript_alerts")
//fire confirm browser event
cy.on("window:confirm", (s) => {
return false;
});
// click on Click for JS Confirm button
cy.get(':nth-child(2) > button').click()
// verify application message on Cancel button click
cy.get('#result').should('have.text', 'You clicked: Cancel')
});
});
Execution Results
输出如下 −
输出日志显示成功验证标签 You clicked: Cancel ,该标签是通过点击确认弹出窗口上的取消按钮产生的。
Cypress - Child Windows
Cypress 没有特定命令来处理子窗口。它有一个 jQuery 的解决方法,通过该方法来处理子窗口。在 HTML 代码中,由于属性目标,一个链接或按钮会打开到子窗口。
如果目标属性值为 blank,它会打开到子窗口。Cypress 使用 jQuery 方法 removeAttr,该方法由 cypress 中的 invoke 命令调用。removeAttribute 删除属性,该属性作为参数之一传递给 invoke 方法。
移除 target=blank 后,一个链接/按钮会在父窗口中打开,并在其上执行操作后,我们可以用 go 命令切换回父 URL。
在 Cypress 中打开子窗口的 html 代码如下:
Implementation
下面给出了 cypress 中子窗口命令的实现:
describe('Tutorialspoint', function () {
// test case
it('Scenario 1', function (){
// url launch
cy.visit("https://the-internet.herokuapp.com/windows")
// delete target attribute with invoke for link
cy.get('.example > a')
.invoke('removeAttr', 'target').click()
// verify child window url
cy.url()
.should('include', 'https://the-internet.herokuapp.com/windows/new')
// shift to parent window
cy.go('back');
});
});
Execution Results
输出如下 −
输出日志显示移除目标属性并启动父窗口中的子窗口。
Cypress - Hidden Elements
Cypress 可以处理隐藏元素。有时,只在鼠标悬停在主菜单上时才显示子菜单。这些子菜单最初被 Cascading Style Sheets (CSS) 属性 display:none 隐藏。
为了处理这些隐藏元素,Cypress 借助于 jQuery 方法 show。必须利用 Cypress 命令 (invoke['show']) 来调用它。
例如,鼠标悬停在登录菜单上时,登录按钮将显示,如下所示:
当鼠标移出登录菜单时,登录按钮将隐藏,如下所示:
Implementation
使用 jQuery show 方法处理隐藏元素的实现如下:
describe('Tutorialspoint Test', function () {
// test case
it('Scenario 1', function (){
// launch URL
cy.visit("https://www.amazon.com/");
// show hidden element with invoke
cy.get('#nav-flyout-ya-signin').invoke('show');
//click hidden element
cy.contains('Sign').click();
});
});
Execution Results
输出如下 −
describe('Tutorialspoint Test', function () {
// test case
it('Scenario 1', function (){
// launch URL
cy.visit("https://www.amazon.com/");
// show hidden element with invoke
cy.get('#nav-flyout-ya-signin').invoke('show');
//click hidden element
cy.contains('Sign').click();
});
});
Execution Results
输出如下 −
执行日志显示步骤右侧图标表示的隐藏元素。
Cypress 有另一种处理隐藏元素的技术。
例如,为了点击隐藏元素,我们可以使用 Cypress 命令 click 并将选项 {force : true} 作为参数传递给它 - click({ force: true })。
这会修改隐藏元素的隐藏特征,我们就可以点击它了。
Implementation with click
下面给出了 Cypress 中包含 click 选项的实现:
describe('Tutorialspoint Test', function () {
// test case
it('Scenario 1', function (){
// launch URL
cy.visit("https://www.amazon.com/");
//click hidden element
cy.contains('Sign').click({force:true});
});
});
Execution Results
输出如下:
执行日志显示隐藏元素已点击(Sign in),并且我们已导航到下一页。
Cypress - Frames
早期版本的 Cypress 无法访问框架中的元素。但是,最近的版本有针对框架的解决方案。
要使用框架,首先,我们必须使用以下命令安装 Cypress 插件:
npm install –D cypress-iframe
将显示的屏幕如下所示:
对于 Cypress 中的框架实现,我们必须在代码中添加语句*import ‘cypressiframe’*。标签名 frame/iframe 用于表示 HTML 代码中的框架。
以下屏幕将出现在您的计算机上:
Cypress 命令 frameload 用于将焦点从主页移到框架。一旦焦点转移,我们就可以与框架内的元素进行交互。
这是通过 cy.iframe 方法完成的。
Implementation
下面通过使用 cy.iframe 方法给出了 Cypress 框架命令的实现:
import 'cypress-iframe'
describe('Tutorialspoint Test', function () {
// test case
it('Test Case6', function (){
// launch URL
cy.visit("https://jqueryui.com/draggable/");
// frame loading
cy.frameLoaded('.demo-frame');
//shifting focus
cy.iframe().find("#draggable").then(function(t){
const frmtxt = t.text()
//assertion to verify text
expect(frmtxt).to.contains('Drag me around');
cy.log(frmtxt);
})
});
});
Execution Results
输出如下 −
执行日志显示了在框架中访问的元素以及其中获取的文本。
Cypress 无法处理页面中的多个框架。
此外,对于 Cypress 中的 Frame Intellisense,我们可以将 /// <reference types = "Cypressiframe"/> 添加到代码中。
Cypress - Web Tables
Cypress 能够处理网络表格。表格基本上有两种类型,动态和静态。静态表格与动态表格不同,它具有固定数量的列和行。
在 html 代码中,表格由表标记名表示,而行由 tr 表示,列由 td 表示。
-
要访问行,Cypress 命令如下所示:
cy.get("tr")
-
要访问列,Cypress 命令如下所示:
cy.get("td") or cy.get("tr td")
-
要访问特定列,CSS 表达式应如下所示:
td:nth-child(column number)
-
要 iterate through the rows/columns 表格,使用 Cypress 命令 each。
在 Cypress 中,我们有命令 next 至 shift to the immediate following sibling element 。此命令必须与 get 命令链接。prev 命令用于移到紧邻的前一个同级元素。
表格的 Html 结构如下所示:
Example
让我们举一个表格的示例,并验证与第一列 AUTOMATION TOOL 中的值 Selenium 相对应的第二列 TYPE(Open Source)的内容。
以下屏幕将出现在您的计算机上:
Implementation
下面是与表格相关的 Cypress 命令的实现:
describe('Tutorialspoint Test', function () {
// test case
it('Scenario 1', function (){
//URL launch
cy.visit("https://sqengineer.com/practice-sites/practice-tables-selenium/")
// identify first column
cy.get('#table1> tbody > tr > td:nth-child(1)').each(($elm, index, $list)=> {
// text captured from column1
const t = $elm.text();
// matching criteria
if (t.includes('Selenium')){
// next sibling captured
cy.get('#table1 > tbody > tr > td:nth-child(1)')
.eq(index).next().then(function(d) {
// text of following sibling
const r = d.text()
//assertion
expect(r).to.contains('Commercial');
})
}
})
});
});
Execution Results
输出如下 −
执行日志显示 TYPE 列中的值被捕获为 Open Source。发生这种情况是因为它是与元素 Selenium(第一列)紧邻的后一个同级元素,并且出现在同一行中。
Cypress - Mouse Actions
Cypress 可以处理隐藏元素。有时只有在将鼠标悬停在主菜单上时才会显示子菜单。这些子菜单最初使用 CSS 属性 display:none 制成隐藏状态。
为了处理隐藏元素,Cypress 使用 jQuery 方法 show。它必须在 Cypress 命令(invoke['show'])的帮助下调用。
例如,将鼠标悬停在“Mouse Hover”按钮上时,Top 和 Reload 按钮会显示,如下所示:
将鼠标移出“Mouse Hover”按钮时,Top 和 Reload 按钮会隐藏,如下所示:
Implementation with jQuery show method
下面是 Cypress 中使用 jQuery show 方法的实现:
describe('Tutorialspoint Test', function () {
// test case
it('Scenario 1', function (){
// launch URL
cy.visit("https://learn.letskodeit.com/p/practice");
// show hidden element with invoke
cy.get('div.mouse-hover-content').invoke('show');
//click hidden element
cy.contains('Top').click();
});
});
Execution Results
输出如下 −
执行日志显示隐藏元素——步骤右侧图标表示的顶部按钮。
Cypress - Cookies
Cypress 使用方法 Cookies.preserveOnce() 和 Cookies.defaults() 处理 Cookies。如果 Cookies 有任何更改,方法 Cookies.debug() 会在控制台生成日志。
默认情况下,Cypress 会在每次测试执行前删除所有 Cookie。我们可以利用 Cypress.Cookies.preserveOnce() 来保留 Cookies 及其名称,以便在其他测试中使用。
Syntax
在 Cypress 中用于与 Cookie 相关的命令的语法如下所示:
这将在配置或清除 Cookie 值时生成控制台日志。
Cypress.Cookies.debug(enable, option)
在此,
-
enable – 如果应该启用 Cookie 的调试。
-
option – 配置 Cookie 的默认值,例如保留 Cookie。
Cypress.Cookies.debug(true) // logs will generate if cookies are modified
cy.clearCookie('cookie1')
cy.setCookie('cookie2', 'val')
降低日志记录的级别。
Cypress.Cookies.debug(true, { verbose: false })
Cypress.Cookies.debug(false) // logs will not generate if cookies are modified
下面给出的语法将保留 Cookies,并且在执行其他测试之前不会清除它们。
Cypress.Cookies.preserveOnce(cookie names...)
此语法用于修改全局配置并维护为测试保留的一组 Cookie。任何修改都将适用于该特定测试(保留在 cypress/support/index.js 文件中并在测试执行前加载)。
Cypress.Cookies.defaults(option)
Cypress.Cookies.defaults({
preserve: 'cookie1'
})
此处,不会在运行测试前清除名为 cookie1 的 Cookie。
Cookie Methods
Cypress 中的一些 Cookie 方法如下:
-
cy.clearCookies() - 从当前域和子域删除所有 Cookie。
-
cy.clearCookie(name) - 通过名称从浏览器中删除 Cookie。
-
cy.getCookie(name) - 用于通过名称从浏览器中获取 Cookie。
-
cy.getCookies() - 用于获取所有 Cookie。
-
cy.setCookie(name) - 可以配置 Cookie。
Implementation
下面给出了在 Cypress 中 Cookie 方法的实现:
describe('Tutorialspoint Test', function () {
// test case
it('Scenario 1', function (){
// launch the application
cy.visit("https://accounts.google.com");
// enable cookie logging
Cypress.Cookies.debug(true)
//set cookie
cy.setCookie('cookie1', 'value1')
//get cookie by name and verify value
cy.getCookie('cookie1').should('have.property', 'value', 'value1')
//clear cookie by name
cy.clearCookie('cookie')
//get all cookies
cy.getCookies()
//clear all cookies
cy.clearCookies()
//verify no cookies
cy.getCookies().should('be.empty')
});
});
Execution Results
输出如下:
Cypress - Get and Post
Get 和 Post 方法是应用程序编程接口 (API) 测试的一部分,可由 Cypress 执行。
Get Method
要执行 Get 操作,我们将用 cy.request() 发出 HTTP 请求,并将方法 Get 和 URL 作为参数传递给该方法。
状态代码反映了请求是否已被正确接受和处理。代码 200(表示确定)和 201(表示已创建)。
Implementation of Get
Get 方法在 Cypress 中的实现如下所示:
describe("Get Method", function(){
it("Scenario 2", function(){
cy.request("GET", "https://jsonplaceholder.cypress.io/comments", {
}).then((r) => {
expect(r.status).to.eq(200)
expect(r).to.have.property('headers')
expect(r).to.have.property('duration')
});
})
})
Execution Results
输出如下 −
Post Method
在使用 Post 方法时,我们实际上正在发送信息。如果我们有一组实体,借助 Post,我们可以在末尾附加新的实体。
为了执行一个 Post 操作,我们将使用 cy.request() 创建一个 HTTP 请求,并将方法 Post 和 URL 作为参数传递给那个方法。
Implementation of Post
下面提供了 Post 方法在 Cypress 中的一个实现:
describe("Post Method", function(){
it("Scenario 3", function(){
cy.request('https://jsonplaceholder.cypress.io/users?_limit=1')
.its('body.0') // yields the first element of the returned list
// make a new post on behalf of the user
cy.request('POST', 'https://jsonplaceholder.cypress.io/posts', {
title: 'Cypress',
body: 'Automation Tool',
})
})
});
Execution Results
输出如下 −
Cypress - File Upload
要在 Cypress 中执行文件上传任务,我们必须首先使用下面提到的命令安装一个插件:
npm install –dev cypress-file-upload
以下屏幕将出现在您的计算机上:
安装完成后,我们必须在 command.js 文件中添加语句 import 'cypress-file-upload'。此文件位于 Cypress 项目中 support 文件夹内。
另外,我们还应将要上传到 fixtures 文件夹(Picture.png 文件)中的文件添加在内。将显示以下屏幕 −
要上传文件,我们必须使用 Cypress 命令 attachFile,并将要上传的文件路径作为参数传递给它。
Implementation
在 Cypress 中上传文件的命令实现方式如下 −
describe('Tutorialspoint Test', function () {
// test case
it('Test Case6', function (){
//file to be uploaded path in project folder
const p = 'Picture.png'
// launch URL
cy.visit("https://the-internet.herokuapp.com/upload")
//upload file with attachFile
cy.get('#file-upload').attachFile(p)
//click on upload
cy.get('#file-submit').click()
//verify uploaded file
cy.get('#uploaded-files').contains('Picture')
});
});
Execution Results
输出如下 −
执行日志显示,Picture.png 文件已上传,文件名称已反映在页面上。
Cypress - Data Driven Testing
Cypress 数据驱动测试借助 fixtures 得以实现。Cypress fixtures 被添加到维护和保存自动化测试数据中。
fixtures 保存在 Cypress 项目中的 fixtures 文件夹(example.json 文件)中。它基本上帮助我们从外部文件获取数据输入。
Cypress fixtures 文件夹可以有 JavaScript 对象表示法 (JSON) 或其他格式的文件,并且数据以“键: 值”对进行维护。
所有测试数据都可以被多个测试使用。所有固定数据都必须在 before 钩子块内声明。
Syntax
Cypress 数据驱动的测试语法如下所示:
cy.fixture(path of test data)
cy.fixture(path of test data, encoding type)
cy.fixture(path of test data, opts)
cy.fixture(path of test data, encoding type, options)
在此,
-
path of test data 是固定数据文件夹内测试数据文件的路径。
-
encoding type - 编码类型(utf-8、asci 等)用于读取文件。
-
Opts - 修改响应的超时时间。默认值为 30000ms。cy.fixture() 的等待时间,之前抛出异常。
Implementation in example.json
下面给出在 Cypress 中使用 example.json 进行数据驱动测试的实现:
{
"email": "abctest@gmail.com",
"password": "Test@123"
}
Implementation of Actual Test
在 Cypress 中实际进行数据驱动测试的实现如下:
describe('Tutorialspoint Test', function () {
//part of before hook
before(function(){
//access fixture data
cy.fixture('example').then(function(signInData){
this.signInData = signInData
})
})
// test case
it('Test Case1', function (){
// launch URL
cy.visit("https://www.linkedin.com/")
//data driven from fixture
cy.get('#session_key ')
.type(this.signInData.email)
cy.get('# session_password').type(this.signInData.password)
});
});
Execution Results
输出如下:
输出日志显示值 abctest@gmail.com 和 Test@123 分别输入到“电子邮件”和“密码”字段。这些数据已从固定数据传递到测试。
Cypress - Prompt Pop-up Window
Cypress 可以处理提示弹出窗口,用户可以在其中输入值。提示有一个文本字段,其中输入是采用。要处理提示弹出窗口,请使用 cy.window() 方法。
获取提示符对象的值(远程窗口)。在确认/警告弹出窗口中,我们必须触发浏览器事件。但对于提示弹出窗口,我们必须使用 cy.stub() 方法。
Example
让我们看一下下面的示例,单击单击 JS 提示按钮时,会显示一个提示弹出窗口,如下所示−
随即显示带用户输入字段的提示。如您所见,Tutorialspoint 已输入在提示弹出窗口中,如下所示。
您输入的 − Tutorialspoint 显示在结果下方。
您可以在以下所示的屏幕中看到这一点−
Implementation
下面是 Cypress 中用于显示提示弹出窗口的命令的实现 −
describe('Tutorialspoint Test', function () {
// test case
it("Scenario 1", function () {
//URL launch
cy.visit("https://the-internet.herokuapp.com/javascript_alerts")
//handling prompt alert
cy.window().then(function(p){
//stubbing prompt window
cy.stub(p, "prompt").returns("Tutorialspoint");
// click on Click for JS Prompt button
cy.get(':nth-child(3) > button').click()
// verify application message on clicking on OK
cy.get('#result').contains('You entered: Tutorialspoint')
});
});
});
Execution Results
输出如下 −
输出日志显示成功验证了文本内容。
You entered − Tutorialspoint ,是单击提示弹出窗口中的确定按钮时产生的。另外,应用于提示窗口的存根在输出日志中可见。
Cypress - Dashboards
必须设置Cypress Dashboard服务,才能创建运行在我们系统中的Cypress测试与托管在云中的控制面板之间的链接。
Features
Cypress Dashboard的功能解释如下:
-
它提供有关通过、失败和跳过的测试用例总数的数据。
-
失败测试的堆栈跟踪和屏幕截图都可用。
-
可以获取测试执行的视频。
-
可以管理测试数据、框架及其访问权限。
-
提供了组织中的使用趋势。
Setup Cypress Dashboard
要设置流程,首先,我们应该转到Cypress Test Runner窗口中的Runs选项卡。然后单击Connect to Dashboard。将出现以下屏幕:
我们将获得各种登录仪表板的选项,如下所示:
成功登录后,我们将收到成功消息。单击Continue。
输入项目名称、所有者和可以看到该项目的用户。
然后,单击Set up project。
Cypress将给出以下建议:
-
project Id
-
唯一项目键(以在终端执行的命令形式出现)
从 Cypress 建议获取的 projectId 应与项目文件夹中的 cypress.json 文件中可用的项目 ID 匹配。
接下来,我们必须按 Cypress 建议运行下面提到的命令 -
node_modules/cypress/bin/cypress run --record --key <project key>
下面给出的屏幕将会出现 -
执行完成后,我们必须打开测试运行器的运行选项卡。它包含有关平台、浏览器和测试持续时间的信息。
测试记录应该可见。单击记录。
记录在浏览器中打开,其中带有测试结果概述(已通过、失败、待处理、跳过的数量),如下所示。
在 Specs 选项卡中,我们应该有每项测试及其结果的详细信息。
此外,还有输出、失败的测试截图、视频等功能。
Cypress - Screenshots and Videos
Cypress 可以处理屏幕截图和视频。首先,让我们了解 Cypress 如何帮助捕获屏幕截图。
Screenshots
我们可以在 Cypress 中使用 screenshot 命令捕获整个页面和特定元素屏幕截图。
此外,Cypress 还具有捕获失败测试屏幕截图的内置功能。要捕获特定场景的屏幕截图,我们使用命令 screenshot。
Screenshot Implementation
在 Cypress 中实现屏幕截图命令的方式如下 −
describe('Tutorialspoint Test', function () {
// test case
it("Scenario 1", function () {
//URL launched
cy.visit("https://the-internet.herokuapp.com/javascript_alerts")
//complete page screenshot with filename - CompletePage
cy.screenshot('CompletePage')
//screenshot of particular element
cy.get(':nth-child(2) > button').screenshot()
});
});
Execution Results
输出如下 −
执行日志显示完整页面屏幕截图已捕获(文件名是 CompletePage.png),以及特定元素(“单击 JS 确认”)的屏幕截图。
这些屏幕截图在项目中 screenshots 文件夹(在 plugins 文件夹中)内部捕获。可以通过更改全局配置,修改捕获屏幕截图的位置。
为全页图像创建的 CompletePage.png 文件。
按钮“单击 JS 确认”的屏幕截图已捕获。
在“测试运行器设置”选项卡中,参数 screenshotOnRunFailure 默认设置为 true 值。因此,总是为失败测试捕获屏幕截图。
此外,screenshotsFolder 参数的值是 cypress/screenshots 值。因此,屏幕截图捕获在 screenshots 文件夹内部。
要禁用捕获失败屏幕截图的功能,我们必须在 cypress.json 文件中添加以下值 −
Cypress.Screenshot.defaults({
screenshotOnRunFailure: false
})
Cypress - Debugging
Cypress 具有非常好的调试功能,我们可以通过它进行时间旅行,并查看测试执行期间实际发生了什么。这可以通过将鼠标悬停在测试运行器日志上完成。
当我们在测试运行器窗口中浏览各个步骤时,元素会高亮显示。我们还可以使用 Cypress 命令 pause。这会暂停执行,在此期间我们可以调试前一个步骤。之后,我们可以再次恢复执行。
Implementation
用于在 Cypress 中调试的命令的实现如下 −
describe('Tutorialspoint Test', function () {
// test case
it('Scenario 1', function (){
// launch the application
cy.visit("https://accounts.google.com");
// enable cookie logging
Cypress.Cookies.debug(true)
cy.getCookies
//pause execution
cy.pause()
cy.setCookie('cookie1', 'value1' )
});
});
Execution Results
输出如下 −
输出日志显示执行已暂停(由已暂停按钮表示)。然后,我们可以在调试完前一个步骤后再次恢复执行,方法是单击恢复按钮(显示在已暂停按钮旁边)。
输出日志现在包含从暂停恢复后执行的所有步骤。
如果我们在浏览器中打开开发者控制台(按 F12),并从测试运行器中选择一个步骤,控制台将显示所用命令和产生值。
例如,对于 setCookie 步骤,控制台显示命令 − setCookie,而产生值显示 cookie 名称 − cookie1 和值 − value1。
Cypress - Custom Commands
Cypress 自定义命令由用户描述,而不是 Cypress 中的默认命令。这些自定义命令用于创建在自动化流程中重复的测试步骤。
我们可以添加覆盖已存在的命令。它们应放置在 Cypress 项目中 support 文件夹内的 commands.js 文件中。
Syntax
Cypress 中自定义命令的语法如下 −
Cypress.Commands.add(function-name, func)
Cypress.Commands.add(function-name, opts, func)
Cypress.Commands.overwrite(function-name, func)
在此,
-
function-name 是正在添加/覆盖的命令。
-
func 是传递给命令参数的传递函数。
-
opts 用于传递一个选项来描述自定义命令的隐式特征。它还用于确定如何处理先前的产生主体(仅适用于 Cypress.Commands.add()),而该选项的默认值为 false。选项 prevSubject 接受 false 忽略先前主体,接受 true 接受先前主体和接受 optional 开始一个链或利用预先存在的链。一个选项接受字符串、数组或布尔值。
Implementation of custom command
下面给出了 commands.js 中自定义命令的实现
Cypress.Commands.add("userInput", (searchTxt) => {
//to input search text in Google and perform search
cy.get("input[type='text']").type(searchTxt);
cy.contains("Google Search").click();
});
Implementation of Actual Test
下面给出了使用自定义命令在 Cypress 中实现实际测试的情况 −
describe('Tutorialspoint Test', function () {
// test case
it('Test Case 6', function (){
// launch the application
cy.visit("https://www.google.com/");
//custom parent command
cy.userInput('Java')
});
});
Execution Results
输出如下 −
输出日志显示自定义命令 – userInput (具有 get、type 和 click 命令)正在执行。
建议自定义命令不要太长。它应该简短,因为在自定义命令中添加太多操作往往会显示执行。
Cypress - Fixtures
利用 Cypress 的装置来维护并保存自动化的测试数据。 装置保存在 Cypress 项目中的装置文件夹(example.json 文件)中。基本上,它帮助我们从外部文件读取数据输入。
Cypress 装置文件夹可以具有 JSON 或其他格式的文件,数据保存在“键:值”对中。
所有测试数据都可以被多个测试使用。所有固定数据都必须在 before 钩子块内声明。
Syntax
Cypress 数据驱动的测试语法如下所示:
cy.fixture(path of test data)
cy.fixture(path of test data, encoding type)
cy.fixture(path of test data, opts)
cy.fixture(path of test data, encoding type, options)
在此,
-
path of test data 是固定数据文件夹内测试数据文件的路径。
-
encoding type - 编码类型(utf-8、asci 等)用于读取文件。
-
Opts - 修改响应的超时时间。默认值为 30000ms。cy.fixture() 的等待时间,之前抛出异常。
Implementation in example.json
以下是 example.json 在 Cypress 中使用数据驱动测试的实现 −
{
"fullName": "Robert",
"number": "789456123"
}
Implementation of Actual Test
在 Cypress 中实际进行数据驱动测试的实现如下:
describe('Tutorialspoint Test', function () {
//part of before hook
before(function(){
//access fixture data
cy.fixture('example').then(function(regdata){
this.regdata=regdata
})
})
// test case
it('Test Case1', function (){
// launch URL
cy.visit("https://register.rediff.com/register/register.php")
//data driven from fixture
cy.get(':nth-child(3) > [width="185"] > input')
.type(this.regdata.fullName)
cy.get('#mobno').type(this.regdata.number)
});
});
Execution Results
输出如下 −
输出日志显示值 Robert 和 789456123 分别被输入到姓名和手机号码字段。此数据已从装置传递到测试。
Cypress - Environment Variables
我们可以定义环境变量,为测试自动化框架全局声明,并且所有测试用例都可以访问它。这种类型的自定义环境变量可以存储在我们项目内的 cypress.json 文件中。
由于 Cypress 的默认配置未公开自定义变量,因此我们必须在 cypress.json 文件中提及键值“evn”,然后设置其值。
另外,为了在实际测试中访问该变量,我们必须使用 Cypress.env 并传递在 json 文件中声明的值。
Implementation in cypress.json
以下是 cypress.json 格式中环境变量命令的实现−
{
"projectId": "fvbpxy",
"env" :
{
"url" : "https://www.google.com/"
}
}
Implementation of Actual Test
以下是 Cypress 中环境变量的实际测试的实现 −
describe('Tutorialspoint Test', function () {
// test case
it('Scenario 1', function (){
// launch application from environment variable
cy.visit(Cypress.env('url'))
cy.getCookies()
cy.setCookie('cookie1', 'value1')
});
});
Execution Results
输出如下 −
输出日志显示了作为 cypress.json 文件中的自定义环境变量设置的发起 URL。
Configure Environment Variables
我们可以通过 --env 标志从命令行配置或修改环境值。
要以有头模式运行特定文件(例如:Test1.js),同时其网址为: https://accounts.google.com ,命令如下:
./node_modules/.bin/cypress run --spec cypress/integration/examples/Test1.js --
env url=https://accounts.google.com –headed
如果我们在 cypress.json 文件中为环境变量网址设置了某一值,与从命令行设置的值不同,Cypress 将优先使用从命令行设置的值。
Cypress - Hooks
Cypress Hooks 用于在每次测试之前/之后执行某些操作。一些常见的 hooks 如下:
-
before - 一旦 describe 块内任何测试的先前执行操作执行完毕,就会执行它。
-
after - 一旦 describe 块内的所有测试的后执行操作执行完毕,就会执行它。
-
beforeEach - 在执行单个块之前执行它,它阻止 describe 块。
-
afterEach - 执行单个块后执行它,它阻止 describe 块。
Implementation
下面对 Cypress Hooks 命令的实现进行了说明:
describe('Tutorialspoint', function() {
before(function() {
// executes once prior all tests in it block
cy.log("Before hook")
})
after(function() {
// executes once post all tests in it block
cy.log("After hook")
})
beforeEach(function() {
// executes prior each test within it block
cy.log("BeforeEach hook")
})
afterEach(function() {
// executes post each test within it block
cy.log("AfterEac hook")
})
it('First Test', function() {
cy.log("First Test")
})
it('Second Test', function() {
cy.log("Second Test")
})
})
Execution Results
输出如下:
输出日志显示,首先执行的步骤是 BEFORE ALL。
最后一个执行的步骤是 AFTER ALL。两者都只运行一次。
在每个 BEFORE EACH 下执行的步骤运行两次(在每个 TEST BODY 之前)。
而且,在每个 AFTER EACH 下执行的步骤运行两次(在每个 TEST BODY 之后)。
这两个 it 块按实现的顺序执行。
TAG
除了钩子,Cypress 还有标签 - .only 和 .skip。
而 .only 标签用于执行它所标记的 it 块,.skip 标签则用于排除它所标记的 it 块。
Implementation with .only
describe('Tutorialspoint', function()
//it block with tag .only
it.only('First Test', function() {
cy.log("First Test")
})
//it block with tag .only
It.only('Second Test', function() {
cy.log("Second Test")
})
it('Third Test', function() {
cy.log("Third Test")
})
})
Execution Results
输出如下 −
输出日志显示带有 .only 标签的 it 块(第一个和第二个测试)只得到了执行。
Implementation with .skip
describe('Tutorialspoint', function()
it('First Test', function() {
cy.log("First Test")
})
it('Second Test', function() {
cy.log("Second Test")
})
//it block with tag .skip
it.skip('Third Test', function() {
cy.log("Third Test")
})
})
Execution Results
输出如下 −
输出日志显示带有 .skip 标签的 it 块(第三个测试)跳过了执行。
Cypress - Configuration of JSON File
Cypress 配置由一些适用于框架内所有测试的键值对组成。Cypress 默认配置可在测试运行器窗口中的“设置”选项卡→“配置”(展开它)下找到。
如果我们在同一窗口中向下看,我们应该看到 Cypress 给出的多个配置的现有值,例如超时、环境变量、文件夹路径等。
它如下所示:
如果我们在同一窗口中向下看,我们应该看到 Cypress 给出的多个配置的现有值,例如超时、环境变量、文件夹路径等。
它如下所示:
Override Default values
要从 cypress.json 文件覆盖默认配置,我们必须指定键值对。
Implementation in cypress.json
覆盖 JSON 文件的默认值实现如下:
{
"baseUrl" : "https://www.google.com/"
}
此处,键是 baseUrl,值是 https://www.google.com/ 。一旦再次运行测试,就会 changes are reflected in the global configurations ,如下所示:
Override Default configurations
我们可以从测试脚本覆盖默认配置,这将适用于测试用例内的单个测试步骤,而不仅适用于完整框架。
这是在 Cypress 中借助 config 命令完成的。
例如,如果我们希望为特定测试步骤增加默认超时,实现如下所示:
//set default time out to nine seconds from following steps in test
Cypress.config('defaultCommandTimeout',9000)
landPage.selectUser().click()
同时,如果在 cypress.json 文件中将 defaultCommandTimeout 值设置为 7 秒,那么 Cypress 将优先考虑应用于测试步骤的超时(即 9 秒)。
最后,它优先考虑默认配置。
Disable Overriding Default configurations
我们可以禁用从 cypress.json 中覆盖默认配置的功能。
cypress.json 中的配置如下:
{
"defaultCommandTimeout" : "9000"
}
要禁用以上配置,运行以下命令:
npx cypress open --config-file false
在运行上述命令后,测试运行器窗口的设置选项卡将显示 config 标记设置为 false。
此外,defaultCommandTimeout 被设为 4 秒,这是由默认配置设定的,并且不会被 cypress.json 的 9 秒值覆盖。
Cypress - Reports
Cypress 与 Mocha 捆绑在一起。因此,任何可为 Mocha 生成的报告也可用于 Cypress。此外,Cypress 还有其他第三方报告工具,如 JUnit 和 teamcity。
Mochawesome Report
Mochawesome 报告是 Cypress 中最重要的报告之一。
-
要 install mochawesome ,运行以下命令:
npm install mochawesome --save-dev
以下屏幕将出现在您的计算机上:
-
要安装 mocha,运行以下命令:
npm install mocha --save-dev
以下屏幕将出现在您的计算机上:
-
要 merge mochawesome json reports ,运行以下命令:
npm install mochawesome-merge --save-dev
以下屏幕将出现在您的计算机上:
安装后,所有这些包都应该反映在 package.json 文件中。
要将多个报告合并为一个报告,运行以下命令:
npm run combine-reports
Configurations in cypress.json file
在 cypress.json 文件中,我们可以为 mochawesome 报告设置以下配置:
-
overwrite - 如果其值设为 false,则不应该覆盖之前生成的报告。
-
reportDir - 这是保存报告的位置。
-
quiet - 如果其值设为 true,则不应该有任何与 Cypress 相关的输出。必须只打印 mochawesome 输出。
-
html - 如果其值设为 false,则不应该在执行后生成任何 html 报告。
-
json - 如果其值设为 true,则会生成包含执行详细信息的 json 文件。
Implementation in cypress.json
在 cypress.json 中对 mochawesome 报告的实现如下:
{
"reporter": "mochawesome",
"reporterOptions": {
"reportDir": "cypress/results",
"overwrite": false,
"html": false,
"json": true
}
}
要为 Cypress 项目的 integration 文件夹中的所有规范生成报告,请运行下面给出的命令:
npx cypress run
要运行特定测试,请运行以下命令:
npx cypress run --spec "<path of spec file>"
执行完成后,会在 Cypress 项目中生成 mochawesome-report 文件夹,其中包含 html 和 json 格式的报告。
右键单击 mochawesome.html 报告。然后,选择复制路径选项,并在浏览器上打开复制的路径。
mochawsome 报告将以执行结果、持续时间、测试用例名称、测试步骤等的详细信息的形式打开。
单击屏幕左上角的图标(在上图中突出显示),将显示更多选项。
我们可以获得不同的视图来选择通过、失败、挂起、跳过的测试用例以及应用于测试的钩子。
JUnit Report
Cypress 提供了另一种称为 JUnit 报告的报告类型。
要为 JUnit 报告安装程序包,请运行下面说明的命令:
npm install cypress-junit-reporter --save-dev
以下屏幕将出现在您的计算机上:
Implementation in cypress.json
下面是对 cypress.json 中 JUnit 报告的实现:
{
"reporter": "junit",
"reporterOptions": {
"mochaFile": "cypress/results/results.xml",
"toConsole": true
}
}
如果我们在某个运行中运行多个测试,并且希望单独的规范文件有唯一的报告,我们必须在cypress.json中mochaFile参数中添加[hash]。
Implementation to avoid overriding report
以下是cypress.json中的一个实现,以避免Cypress中有优先报告
{
"reporter": "junit",
"reporterOptions": {
"mochaFile": "cypress/results/results-[hash].xml",
"toConsole": true
}
}
要生成Cypress项目中integration文件夹中所有规格的报告,请运行以下命令:
npx cypress run --reporter junit
以下屏幕将出现在您的计算机上:
执行完成后,Cypress项目中会生成一个results文件夹,其中包含xml格式的报告。
Cypress - Plugins
Cypress 有多个插件可添加到其功能中。有多种类型的插件,例如身份验证、组件测试、自定义命令、开发工具等。
一些非常重要的插件包括 −
要在 Cypress 中使用 perform file upload task ,我们必须首先使用下面提到的命令安装 install a plugin −
npm install –dev cypress-file-upload
安装完成后,我们必须在 command.js 文件中添加语句 import 'cypress-file-upload',该文件位于 Cypress 项目中的 support 文件夹内。
要使用框架,首先,我们必须使用下面给出的命令安装 Cypress plugin for frames −
npm install –D cypress-iframe
然后,我们必须在代码中添加语句 import 'cypress-iframe'。
要 identify elements with xpath locator ,运行以下命令 −
npm install cypress-xpath
安装完成后,我们必须在 index.js 文件中添加语句 require (“cypress-xpath”),该文件位于 Cypress 项目中的 support 文件夹内。
此外,我们必须使用 cy.xpath 命令来识别元素。
要 enable themes ,我们必须使用下面提到的命令安装一个插件 −
npm install --save-dev cypress-dark
安装完成后,我们必须在 index.js 文件中添加语句 require ("cypress-dark”),该文件位于 Cypress 项目中的 support 文件夹内。