Cypress 简明教程

Cypress - Quick Guide

Cypress - Introduction

Cypress 是一款开源的免费自动化测试工具,从长远来看可以广泛使用。主要用于前端测试自动化。该工具主要开发用于解决团队在应用程序自动化过程中遇到的问题。

Cypress 有助于实现以下目标 −

  1. Configure tests.

  2. Configure tests.

  3. Execute tests.

  4. Identify errors (if any).

Selenium 和 Cypress 经常在功能方面进行比较。但是,Cypress 在架构和特性方面有所不同。此外,它解决了我们在 Selenium 中面临的一些问题。

Cypress 基于 JavaScript,并在浏览器中执行测试。它有助于开发包括以下内容的测试:

  1. Unit tests.

  2. End to end tests.

  3. Integration tests.

Features

Cypress 的重要特性如下所示:

  1. Supports Test-Driven development.

  2. Provides Dashboard services.

  3. 使用生成堆栈跟踪和错误的开发人员工具进行有效的调试。

  4. 为失败的测试提供屏幕截图。

  5. 无需添加等待语句来在一段时间内停止执行。默认情况下,在执行以下步骤或断言之前应用等待语句。

  6. 能够监控和控制服务器响应、功能和计时器的特性,这对于单元测试来说必不可少。

  7. 检查和管理网络流量。

  8. Allows the multi-browser support.

  9. 提供了用于捕获执行视频的内置功能。

  10. 可以与持续集成工具集成。

  11. 具有视窗大小调整的页面响应能力。

  12. 默认情况下,重新加载应用于测试的更改。

  13. 提供了友好的应用程序编程接口 (API)。

  14. 可以使用测试运行器,该运行器允许直接从用户界面 (UI) 执行测试。

Disadvantages

使用 Cypress 会有一些缺点,如下所示:

  1. 它仅基于 JavaScript。

  2. 一个相对较新的工具,因此,社区支持并不广泛。

  3. 它无法执行移动端测试。

  4. 无法访问 Shadow Document Object Model (DOM)。

  5. 选项卡/子窗口由变通方法管理。

Cypress - Architecture and Environment Setup

Cypress 架构如下图所示 −

cypress architecture

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}。将出现的屏幕如下所示 -

nodejs

将同时提供 Windows 和 macOS 安装程序。我们必须根据本地操作系统获取软件包。

对于 64 位 Windows 配置,会弹出以下窗口提示保存安装程序。

node v14.15

安装完成后,程序文件中将创建一个 nodejs 文件。记下该文件的路径。然后,如下所示从“开始”处输入环境变量 −

environment variables

在“系统属性”弹出窗口中,转到“高级”,单击“环境变量”。然后单击确定。

system properties advance

在“环境变量”弹出窗口中,转到“系统变量”部分并单击“新建”。

system variables

在“新建系统变量”弹出窗口中,分别在“变量名”和“变量值”字段中输入 NODE_HOME 和 node.js 路径(前面已记录)。

new system variables

设置 node.js 文件的路径后,我们将在任何所需位置创建一个空文件夹(比如 cypressautomation)。

接下来,我们需要一个 JavaScript 编辑器来编写 Cypress 的代码。为此,我们可以从链接 [role="bare"] [role="bare"]https://code.visualstudio.com/ 下载 Visual Studio Code。

根据本地操作系统选择正确的包 −

local operating system

下载可执行文件并完成所有安装步骤后,Visual Studio Code 将启动。

visual studio

从“文件”菜单中选择“打开文件夹”选项。然后,将 CypressAutomation 文件夹(我们之前创建的)添加到 Visual Studio Code。

cypressautomation folder

我们需要使用以下命令从终端创建 package.json 文件 −

我们必须输入包名称、描述等详细信息,如下面给出的图像中所示 −

npm init

完成后,package.json 文件将使用我们提供的信息在项目文件夹中创建。

package

完成后,package.json 文件将使用我们提供的信息在项目文件夹中创建。

project folder

最终,要安装 Cypress,运行下面给出的命令 -

npm install cypress --save-dev

你将获得以下输出 -

install cypress

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 文件夹中提供了示例项目文件夹结构。

单击“确定,我知道了!”按钮。然后,计算机上将显示如下屏幕:

test runner

然后,测试运行器将启动,其中 examples 文件夹下提供了一个以上的 spec 文件,如下所示:

files

要运行特定文件,例如 test2.spec.js,我们必须单击它。此外,还提供了浏览器和停止执行的选项。

test2 spec js

执行应当从以下屏幕开始,显示测试步骤、测试用例名称、测试套件、URL、测试持续时间、浏览器尺寸,等等。

dimension of browser

Cypress - Build First Test

一旦 Cypress 配置完毕,就会在项目内创建一个框架,该框架在 Explorer 中自动可见。新的测试文件(比如 FirstTest.spec.js)应在 integration 文件夹中创建,如下所示。

integration folder

Cypress Folder Structure

让我们了解 Cypress 中的文件结构。Cypress 文件夹中包含的因素如下所述:

  1. fixtures - 此处维护测试作为键值对形式的测试数据。

  2. integration - 此处维护框架的测试用例。

  3. plugins - 此处维护 Cypress 事件(测试前和测试后执行的事件)。

  4. support - 此处创建可重用方法或自定义命令,测试用例可以直接利用它们,而不进行对象创建。

  5. videos - 以视频的形式记录执行的测试步骤,并在此处维护。

  6. node_modules - 此文件夹维护 npm 的项目依赖项。它是 Cypress 项目执行的核心。

  7. cypress.json - 此文件夹中设置了默认配置。可以在此处修改当前配置的值,这将覆盖默认配置。

  8. package.json - 此文件夹维护项目的依赖项和脚本。

Structure of a Basic Test

Cypress 遵循 JavaScript 测试框架(Mocha、Jasmine 等)。要在 Cypress 中创建测试,我们必须遵守以下框架准则:

  1. 测试套件名称必须在 describe 函数内提供。

  2. 测试套件内的测试用例名称必须在相同函数内提供,或者您必须指定该函数。

  3. 测试用例内的测试步骤必须在 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>"

以下屏幕将出现在您的计算机上:

specific file from command line

Cypress - Supported Browsers

Cypress可以在Chrome、Electron和Firefox等浏览器中运行测试。在测试运行器中,我们可以在右上角选择浏览器。

另外,必须注意的是,如果浏览器选项不可用,这意味着我们的系统中没有最新版本的浏览器。

cypress electron

Execution from Other Browsers

下面解释了从命令行从其他浏览器执行:

要运行 execution in Chrome ,您需要运行下面提到的命令:

./node_modules/.bin/cypress run -- browser chrome

您会看到以下画面:

execution in chrome

要运行 execution in Firefox ,运行下面给出的命令:

./node_modules/.bin/cypress run -- browser firefox

您会看到以下画面:

execution in headed mode

要运行 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')

as

它提供了别名以便以后使用。

用法如下:

//alias element as parent
cy.get('#txt').find('li').first().as('parent')

blur

它模糊焦点中元素。

用法如下:

//blur input
cy.get('#txt'). type('abc').blur()

check

它选中单选按钮或复选框,并应用于拥有 input 标签的元素。

用法如下:

//checks element having class attribute chkbox
cy.get('.chkbox').check()

children

它获得元素的子元素。

用法如下:

//obtains children of element n
cy.get('n').children()

clear

它从 textarea 或 input 中删除值。

用法如下:

//removes input abc
cy.get('#txt'). type('abc').clear()

clearCookie

它删除特定的浏览器 cookie。

用法如下:

//clear abc cookie
cy.clearCookie('abc')

clearCookies

它从现有域和子域中删除浏览器 cookie。

用法如下:

//clear all cookies
cy.clearCookies()

clearLocalStorage

它从现有域和子域中删除本地存储数据。

用法如下:

//clear all local storage
cy. clearLocalStorage ()

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()

debug

它修复调试器,并由先前命令返回日志值。

用法如下:

//pause to debug at start of command
cy.get('#txt').debug()

document

它在活动页面上获得 window.document。

用法如下:

cy.document()

each

它遍历具有 length 属性的数组。

用法如下:

//iterate through individual li
cy.get('li').each(() => {...})

end

它结束命令链。

用法如下:

//obtain null instead of input
cy.contains('input').end()

eq

它引用元素数组中特定索引处的元素。

用法如下:

//obtain third td in tr
cy.get('tr>td').eq(2)

exec

它运行系统命令。

用法如下:

cy.exec('npm init')

find

它获得特定定位器的后代元素。

用法如下:

//obtain td from tr
cy.get('tr').find('td')

first

它从一组元素中获取第一个元素。

用法如下:

//obtain first td in tr
cy.get('tr>td').first()

get

它通过定位器获取单个或多个元素。

用法如下:

//obtain td from tr

find

它获得特定定位器的后代元素。

用法如下:

//obtain all td from tr in list
cy.get('tr>td')

getCookie

它通过名称获取特定浏览器 cookie。

用法如下:

cy.getCookie('abc')

getCookies

它获取所有 cookie。

用法如下:

cy.getCookies()

go

在浏览器历史记录中向前或向后移动到下一个或上一个 URL。

用法如下:

//like clicking back button
cy.go('back')
//like clicking forward button
cy.go('forward')

visit

它启动一个 URL。

用法如下:

cy.visit('https://www.tutorialspoint.com/index.htm')

next

它获取文档对象模型 (DOM) 中元素组中元素的直接同级元素。

用法如下:

//gives the following link in element l.
cy.get('l a:first').next()

parent

它从 DOM 中元素组中获取父元素。

用法如下:

//get parent of element with class h
cy.get('.h').parent()

should

它用于创建断言,是 .and() 的别名。

用法如下:

//assert element is visible & enabled
cy.get('#txt').should('be.visible').and('be.enabled')

wait

在执行下一步之前,以毫秒为单位或以别名元素等待一段时间。

用法如下:

cy.wait(1000)

title

它获取活动页面的 document.title。

用法如下:

cy.title()

viewport

它管理屏幕的尺寸和定位。

用法如下:

// viewport to 100px and 500px
cy.viewport(100, 500)

log

它将消息打印到命令日志。

用法如下:

cy.log('Cypress logging ')

reload

它用于页面的重新加载。

用法如下:

cy.reload()

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)
   })
})

Elements

别名可以与文档对象模型(DOM)元素一起使用,并随后被重新使用。在下面的示例中,默认情况下,Cypress 会引用获得的 td 集合作为别名 cols。要使用相同的 cols,我们必须使用 cy.get() 命令。

// alias td in tr
cy.get('tr').find('td').as('cols')
cy.get('@cols').first().click()

因为我们在 cy.get() 中使用了 @,所以 Cypress 搜索当前的别名 (cols) 并生成它的引用。

Routes

别名可以与路由一起使用。它确保应用程序发起了请求。然后,它等待服务器的响应并访问请求进行验证。

cy.intercept('POST', '/users', { id: 54 }).as('u')
cy.get('#btn').click()
cy.wait('@u').then(({ request }) =>{
//assertion
   expect(request.body).to.have.property('name', 'User')
})
cy.contains('User added')

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 表达式的规则。

css expression

Rules of CSS expression

级联样式表 (CSS) 表达式的规则如下 −

  1. 带属性 ID 和标签名的语法为标签名#id − 这里,CSS 表达式应为 - input#gsc-i-id1。

  2. 带属性类和标签名的语法为标签名.类 − 这里,CSS 表达式应为 - input.gsc-input。

  3. 带任何属性值和标签名的语法为标签名[属性='值' − 这里,CSS 表达式应为 - input[title='search']。

  4. 带父项到子项遍历的语法为父项子项 − 这里,CSS 表达式应为 - tr td。

Cypress 提供了打开选择器演练场功能,我们可以从该演练场自动定位和识别元素。此功能位于测试运行器窗口中,在下图中突出显示。

test runner toolbar

单击打开选择器演练场时,一个箭头会变得可见。单击它并将其移动到我们必须识别的元素。CSS 表达式会填充在箭头右侧可用的字段 cy.get 中。

同时,元素会突出显示,如下所示 −

tutorialspoint scenario1

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

输出如下 −

implicit assertions

输出日志显示了使用 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

输出如下 −

explicit assertions

输出日志显示了使用 expect 命令直接应用于对象的断言。

Cypress 拥有默认断言,这些断言在内部处理,不需要专门调用。

以下是一些示例 −

  1. cy.visit () − 期望页面以 200 状态码显示内容。

  2. cy.request () − 期望远程服务器可用并发送响应。

  3. cy.contains() - 预计 Web 元素及其属性在 DOM 中可用。

  4. cy.get() - 预计 Web 元素在 DOM 中可用。

  5. .find () − Expects the web element to be available in DOM.

  6. .type () − Expects the web element to turn to a type able state.

  7. .click () − Expects the web element to turn to a clickable state.

  8. .its () − Expects for a web element property on the existing subject.

Other Cypress assertions

其他 Cypress 断言如下:

length

It 检查从先前链接命令中获得的元素的计数。

例如,

cy.get('#txt-fld').should('have.length',5)

value

It 检查 Web 元素是否具有某个值。

例如,

cy.get('#txt-fld').should('have.length',5)

value

It 检查 Web 元素是否具有某个值。

例如,

cy.get(' #txt-fld').should('have.value', 'Cypress')

class

It 检查 Web 元素是否具有某个 class。

例如,

cy.get('#txt-fld'').should('have.class', 'txt')

contain

It 检查 Web 元素是否具有某个文本。

例如,

cy.get('#txt-fld'').should('contain', 'Cypress')

visible

It 检查 Web 元素是否可见。

例如,

cy.get('#txt-fld'').should('be.visible')

exist

It 检查 Web 元素是否在文档对象模型 (DOM) 中可用。

例如,

cy.get('#txt-fld'').should('not.exist');

css

It 检查 Web 元素是否具有某个 CSS 属性。

例如,

cy.get('#txt-fld'').should('have.css', 'display', 'block');

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

输出如下 −

implementation with text()

输出日志显示使用 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

输出如下:

implementation with text assertions

输出日志显示使用 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

输出如下 −

asynchronous behavior in cypress

Promise

右键单击测试运行器,然后单击 Inspect,我们可以在控制台验证结果。此处, Tutorialspoint-Cypress (先前的步骤)在控制台登录,早于 Sign – in (稍后添加的步骤)。

Cypress 命令的设计方式是按照顺序执行每一步,而不是同时触发它们。但是,它们按顺序排列。因此,它使得流变得同步。这是通过 Promise 实现的。

在上面的示例中, console.log 是一个纯 JavaScript 语句。它没有像 Cypress 命令那样排队等待的能力。Promise 使我们可以以串行模式执行 Cypress 命令。

Modes in Promise

Promise 有三种模式来对命令执行的状态进行分类。它们如下:

  1. Resolved - 如果测试步骤成功运行,则会出现此结果。

  2. Pending - 如果正在等待测试步骤运行的结果,则这就是结果。

  3. 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 的状态。

Implementation without Promise

以下命令解释了如何在 Cypress 中在没有 promise 的情况下完成实现:

describe('Tutorialspoint Test', function () {
   it('Without Promise', function (){
      cy.visit('https://accounts.google.com')
      cy.get('h1#heading')
   })
})

Cypress - Working with XHR

XHR 是 XML HTTP Request。它是一个应用程序编程接口 (API),可用作对象,其方法在 Web 浏览器和服务器之间发送数据。XHR 中的对象可以请求以响应形式从服务器请求数据。

Cypress 不仅可以用于前端自动化,还可以通过直接访问 XHR 对象来控制网络流量。然后,它对该对象应用断言。它可以模拟或伪造响应。可以在浏览器的网络选项卡中查看 XHR 详细信息。

XHR 响应头的语法如下:

xhr response header

响应如下:

response

可以使用 cy.request() 命令执行 XHR 请求。cy.intercept() 方法用于将响应重定向到匹配的请求。

Implementation of XHR request

以下命令用于解释 XHR 请求在 Cypress 中的实现——

cy.request('https://jsonplaceholder.cypress.io/comments').as('c')
//aliasing request
cy.get('@c').should((response) => {
   expect(response.body).to.have.length(100)
   expect(response).to.have.property('headers')
})

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 元素,我们可以验证测试,如下所示——

implementation of jquery methods

日志消息——登录——是从 Cypress 中的 cy.log 命令获得的。

Cypress - Checkbox

检查和取消检查命令用于处理复选框。在 html 代码中,复选框有一个 input 标签,其 type 属性的值为 checkbox。

Cypress Commands

与复选框相关的 Cypress 命令如下所示——

  1. 用于 click all the checkboxes 的命令如下所示——

cy.get('input[type="checkbox"]').check()
  1. 用来 click a checkbox with id check 的命令如下:

cy.get('#chk').check()
  1. 用来 click a checkbox with value Cypress 的命令如下:

cy.get('input[type="checkbox"]').check('Cypress')
  1. 用来 click the checkboxes with values - Java and Python 的命令如下:

cy.get('input[type="checkbox"]').check(['Java','Python'])
  1. 用来 click the checkbox having value Java with options 的命令如下:

cy.get('.chk').check('Java', options)
  1. 用来 click the checkboxes with values – Java and Python with options 的命令如下:

cy.get('input[type="checkbox"]').check(['Java','Python'], options)
  1. 用来 click the checkbox having class check with an option 的命令如下:

cy.get('.chk').check({force : true})
  1. 用来 uncheck all the checkboxes 的命令如下:

cy.get('input[type="checkbox"]').uncheck()
  1. 用来 uncheck a checkbox with id check 的命令如下:

cy.get('#chk').uncheck()
  1. 用来 uncheck the checkbox with value Cypress 的命令如下:

cy.get('input[type="checkbox"]').uncheck('Cypress')
  1. 用来 uncheck the checkboxes with values - Java and Python 的命令如下:

cy.get('input[type="checkbox"]').uncheck(['Java','Python'])
  1. 用来取消选择具有选项 Java 的复选框的命令如下:

cy.get('.chk').uncheck('Java', options)
  1. 用来 uncheck the checkboxes with values – Java and Python 和选项的命令如下:

cy.get('input[type="checkbox"]').uncheck(['Java','Python'], options)
  1. 用来 uncheck the checkbox having class check with an option 的命令如下:

cy.get('.chk').uncheck({force : true)

Options in Cypress

Cypress 中可用的选项如下:

  1. log – Default value – true − 用于开启/关闭控制台日志。

  2. timeout – Default value – defaultCommandTimeout(4000ms) − 用于在引发错误之前提供一个最长的等待时间。

  3. force – Default value – false − 用于强制执行一个动作。

  4. scrollBehaviour – Default value – scrollBehaviour(top) − 用于在执行命令之前将元素滚动到的视口的位置。

  5. waitForAnimations – Default value – waitForAnimations(true) − 用于在运行命令之前,等待元素完成动画。

  6. 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

输出如下:

implementation of cypress commands

上述结果显示“显示密码”左侧的复选框,首先使用 check 命令选中(使用断言应进行验证)。

然后,使用 uncheck 命令取消选中(也使用断言应进行验证)。

Cypress - Tabs

Cypress 没有处理选项卡的具体命令。它在 jQuery 中有一个解决方法,通过它处理选项卡。在 html 代码中,由于 target 特性,链接或按钮会打开新选项卡。

如果 target 特性具有空白值,它会打开新选项卡。Cypress 使用 jQuery 方法 removeAttr,它由 invoke 命令调用。removeAttr 删除特性,该特性作为 invoke 方法的参数之一传递。

一旦删除 target=blank,链接/按钮就会在父窗口中打开。稍后,对其执行操作之后,我们可以使用 go 命令返回父 URL。

为此,Html 代码如下:

tabs

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

输出如下 −

implementation

输出日志显示在父窗口中删除了 target 特性并启动了新选项卡。

Cypress - Dropdown

select 命令用于处理静态下拉列表。在 html 代码中,下拉列表具有 select 标记,下拉列表元素通过 option 标记名表示。

Dropdown Cypress Commands

与下拉列表相关的 Cypress 命令如下所示:

  1. 用于选择 the option Cypress 的命令如下所示:

cy.get('select').select('Cypress')
  1. 用于选择选项 Tutorialspoint 和 JavaScript 的命令如下所示:

cy.get('select').select(['Tutorialspoint', 'JavaScript'])
  1. 可以选择下拉选项的值以及选项 (to modify default characteristics) 的命令如下所示:

cy.get('select').select('option1', options )
  1. 用于选择 the multiple values with options 的命令如下所示:

cy.get('select').select(['option1', 'option2'], options)

Options for dropdown in Cypress

Cypress 中可用于下拉列表的选项如下所示:

  1. log – Default value – true − 用于打开/关闭控制台日志。

  2. timeout – Default value – defaultCommandTimeout(4000) − 用于在引发错误之前提供选择的最长等待时间。

  3. force – Default value – false − 用于执行操作。

断言可以应用于 Cypress 中的 select 命令。

让我们尝试从下拉列表中选择选项 India ,该选项在 html 代码中的值为 99。

dropdown cypress commands

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

输出如下 −

dropdown commands

输出显示 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 execution logs

警报信息显示在 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

输出如下:

implementation alert text verification

输出日志显示成功验证了警报文本,该警报是由 Cypress 触发的警报事件产生的。

对于确认弹出窗口,触发浏览器事件 window:confirm。就像警报弹出窗口一样,Cypress 可以使用 on 方法触发此事件,并且在缺省情况下单击“确定”按钮。

Example

我们来看一下下面的示例。在此,单击“单击以获取 JS 确认”按钮时,会显示确认弹出窗口。

javascript alerts

显示包含按钮 OKCancel 的以下确认弹出窗口。

js confirm

单击“确定”按钮后,显示以下内容−

You clicked: Ok

将显示一个如下图所示的图像 −

js alerts

点击 Cancel 按钮时,Result − 下方会显示以下内容:

You clicked: Cancel

将显示一个如下图所示的图像 −

js 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

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

输出如下 −

clicked ok

输出日志显示成功验证确认文本,该文本是通过 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

输出如下 −

implementation cancel click

输出日志显示成功验证标签 You clicked: Cancel ,该标签是通过点击确认弹出窗口上的取消按钮产生的。

Cypress - Child Windows

Cypress 没有特定命令来处理子窗口。它有一个 jQuery 的解决方法,通过该方法来处理子窗口。在 HTML 代码中,由于属性目标,一个链接或按钮会打开到子窗口。

如果目标属性值为 blank,它会打开到子窗口。Cypress 使用 jQuery 方法 removeAttr,该方法由 cypress 中的 invoke 命令调用。removeAttribute 删除属性,该属性作为参数之一传递给 invoke 方法。

移除 target=blank 后,一个链接/按钮会在父窗口中打开,并在其上执行操作后,我们可以用 go 命令切换回父 URL。

在 Cypress 中打开子窗口的 html 代码如下:

opening a new window

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

输出如下 −

new window

输出日志显示移除目标属性并启动父窗口中的子窗口。

Cypress - Hidden Elements

Cypress 可以处理隐藏元素。有时,只在鼠标悬停在主菜单上时才显示子菜单。这些子菜单最初被 Cascading Style Sheets (CSS) 属性 display:none 隐藏。

为了处理这些隐藏元素,Cypress 借助于 jQuery 方法 show。必须利用 Cypress 命令 (invoke['show']) 来调用它。

例如,鼠标悬停在登录菜单上时,登录按钮将显示,如下所示:

sign in

当鼠标移出登录菜单时,登录按钮将隐藏,如下所示:

sign in menu

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

输出如下 −

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

输出如下 −

hidden elements with jquery

执行日志显示步骤右侧图标表示的隐藏元素。

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

输出如下:

implementation with click

执行日志显示隐藏元素已点击(Sign in),并且我们已导航到下一页。

Cypress - Frames

早期版本的 Cypress 无法访问框架中的元素。但是,最近的版本有针对框架的解决方案。

要使用框架,首先,我们必须使用以下命令安装 Cypress 插件:

npm install –D cypress-iframe

将显示的屏幕如下所示:

cypress plugin

对于 Cypress 中的框架实现,我们必须在代码中添加语句*import ‘cypressiframe’*。标签名 frame/iframe 用于表示 HTML 代码中的框架。

以下屏幕将出现在您的计算机上:

cypressiframe

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

输出如下 −

draggable

执行日志显示了在框架中访问的元素以及其中获取的文本。

Cypress 无法处理页面中的多个框架。

此外,对于 Cypress 中的 Frame Intellisense,我们可以将 /// <reference types = "Cypressiframe"/> 添加到代码中。

Cypress - Web Tables

Cypress 能够处理网络表格。表格基本上有两种类型,动态和静态。静态表格与动态表格不同,它具有固定数量的列和行。

在 html 代码中,表格由表标记名表示,而行由 tr 表示,列由 td 表示。

  1. 要访问行,Cypress 命令如下所示:

 cy.get("tr")
  1. 要访问列,Cypress 命令如下所示:

 cy.get("td") or cy.get("tr td")
  1. 要访问特定列,CSS 表达式应如下所示:

td:nth-child(column number)
  1. iterate through the rows/columns 表格,使用 Cypress 命令 each。

在 Cypress 中,我们有命令 nextshift to the immediate following sibling element 。此命令必须与 get 命令链接。prev 命令用于移到紧邻的前一个同级元素。

表格的 Html 结构如下所示:

html structure

Example

让我们举一个表格的示例,并验证与第一列 AUTOMATION TOOL 中的值 Selenium 相对应的第二列 TYPE(Open Source)的内容。

以下屏幕将出现在您的计算机上:

automation tool

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

输出如下 −

practice tables

执行日志显示 TYPE 列中的值被捕获为 Open Source。发生这种情况是因为它是与元素 Selenium(第一列)紧邻的后一个同级元素,并且出现在同一行中。

Cypress - Mouse Actions

Cypress 可以处理隐藏元素。有时只有在将鼠标悬停在主菜单上时才会显示子菜单。这些子菜单最初使用 CSS 属性 display:none 制成隐藏状态。

为了处理隐藏元素,Cypress 使用 jQuery 方法 show。它必须在 Cypress 命令(invoke['show'])的帮助下调用。

例如,将鼠标悬停在“Mouse Hover”按钮上时,Top 和 Reload 按钮会显示,如下所示:

mouse hover

将鼠标移出“Mouse Hover”按钮时,Top 和 Reload 按钮会隐藏,如下所示:

mouse hover button

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

输出如下 −

implementation with jquery show method

执行日志显示隐藏元素——步骤右侧图标表示的顶部按钮。

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)

在此,

  1. enable – 如果应该启用 Cookie 的调试。

  2. 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。

Cypress 中的一些 Cookie 方法如下:

  1. cy.clearCookies() - 从当前域和子域删除所有 Cookie。

  2. cy.clearCookie(name) - 通过名称从浏览器中删除 Cookie。

  3. cy.getCookie(name) - 用于通过名称从浏览器中获取 Cookie。

  4. cy.getCookies() - 用于获取所有 Cookie。

  5. 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

输出如下 −

get method

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

以下屏幕将出现在您的计算机上:

upload task in cypress

安装完成后,我们必须在 command.js 文件中添加语句 import 'cypress-file-upload'。此文件位于 Cypress 项目中 support 文件夹内。

另外,我们还应将要上传到 fixtures 文件夹(Picture.png 文件)中的文件添加在内。将显示以下屏幕 −

picture png file

要上传文件,我们必须使用 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

输出如下 −

uploading a file in cypress

执行日志显示,Picture.png 文件已上传,文件名称已反映在页面上。

Cypress - Data Driven Testing

Cypress 数据驱动测试借助 fixtures 得以实现。Cypress fixtures 被添加到维护和保存自动化测试数据中。

fixtures 保存在 Cypress 项目中的 fixtures 文件夹(example.json 文件)中。它基本上帮助我们从外部文件获取数据输入。

fixtures

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)

在此,

  1. path of test data 是固定数据文件夹内测试数据文件的路径。

  2. encoding type - 编码类型(utf-8、asci 等)用于读取文件。

  3. 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

输出如下:

implementation of actual test

输出日志显示值 abctest@gmail.com 和 Test@123 分别输入到“电子邮件”和“密码”字段。这些数据已从固定数据传递到测试。

Cypress - Prompt Pop-up Window

Cypress 可以处理提示弹出窗口,用户可以在其中输入值。提示有一个文本字段,其中输入是采用。要处理提示弹出窗口,请使用 cy.window() 方法。

获取提示符对象的值(远程窗口)。在确认/警告弹出窗口中,我们必须触发浏览器事件。但对于提示弹出窗口,我们必须使用 cy.stub() 方法。

Example

让我们看一下下面的示例,单击单击 JS 提示按钮时,会显示一个提示弹出窗口,如下所示−

click for js prompt

随即显示带用户输入字段的提示。如您所见,Tutorialspoint 已输入在提示弹出窗口中,如下所示。

prompt pop up

您输入的 − Tutorialspoint 显示在结果下方。

您可以在以下所示的屏幕中看到这一点−

entered result

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

输出如下 −

implementation of the commands

输出日志显示成功验证了文本内容。

You enteredTutorialspoint ,是单击提示弹出窗口中的确定按钮时产生的。另外,应用于提示窗口的存根在输出日志中可见。

Cypress - Dashboards

必须设置Cypress Dashboard服务,才能创建运行在我们系统中的Cypress测试与托管在云中的控制面板之间的链接。

Features

Cypress Dashboard的功能解释如下:

  1. 它提供有关通过、失败和跳过的测试用例总数的数据。

  2. 失败测试的堆栈跟踪和屏幕截图都可用。

  3. 可以获取测试执行的视频。

  4. 可以管理测试数据、框架及其访问权限。

  5. 提供了组织中的使用趋势。

Setup Cypress Dashboard

要设置流程,首先,我们应该转到Cypress Test Runner窗口中的Runs选项卡。然后单击Connect to Dashboard。将出现以下屏幕:

setup cypress dashboard

我们将获得各种登录仪表板的选项,如下所示:

logging on to the dashboard

成功登录后,我们将收到成功消息。单击Continue。

login successful

输入项目名称、所有者和可以看到该项目的用户。

然后,单击Set up project。

setup project

Cypress将给出以下建议:

  1. project Id

  2. 唯一项目键(以在终端执行的命令形式出现)

cypress suggestion

从 Cypress 建议获取的 projectId 应与项目文件夹中的 cypress.json 文件中可用的项目 ID 匹配。

projectid

接下来,我们必须按 Cypress 建议运行下面提到的命令 -

node_modules/cypress/bin/cypress run --record --key <project key>

下面给出的屏幕将会出现 -

screen

执行完成后,我们必须打开测试运行器的运行选项卡。它包含有关平台、浏览器和测试持续时间的信息。

测试记录应该可见。单击记录。

test records

记录在浏览器中打开,其中带有测试结果概述(已通过、失败、待处理、跳过的数量),如下所示。

test result overview

在 Specs 选项卡中,我们应该有每项测试及其结果的详细信息。

此外,还有输出、失败的测试截图、视频等功能。

failed test screenshot

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

输出如下 −

click for js confirm

执行日志显示完整页面屏幕截图已捕获(文件名是 CompletePage.png),以及特定元素(“单击 JS 确认”)的屏幕截图。

这些屏幕截图在项目中 screenshots 文件夹(在 plugins 文件夹中)内部捕获。可以通过更改全局配置,修改捕获屏幕截图的位置。

为全页图像创建的 CompletePage.png 文件。

completepage

按钮“单击 JS 确认”的屏幕截图已捕获。

screenshot of the button

在“测试运行器设置”选项卡中,参数 screenshotOnRunFailure 默认设置为 true 值。因此,总是为失败测试捕获屏幕截图。

此外,screenshotsFolder 参数的值是 cypress/screenshots 值。因此,屏幕截图捕获在 screenshots 文件夹内部。

screenshots folder parameter

要禁用捕获失败屏幕截图的功能,我们必须在 cypress.json 文件中添加以下值 −

Cypress.Screenshot.defaults({
   screenshotOnRunFailure: false
})

Videos

默认情况下,Cypress 的视频录制功能对测试启用。它们存储在项目中的 videos 文件夹中。

一旦使用以下提到的命令运行 Cypress 测试 −

node_modules/.bin/cypress run

我们得到控制台消息以及视频位置、压缩详细信息等 −

location of the video

我们在项目中同一位置获取相应的视频。

video capture feature

要禁用视频捕获功能,我们必须在 cypress.json 文件中添加以下值 −

{
   "video": 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

输出如下 −

debugging

输出日志显示执行已暂停(由已暂停按钮表示)。然后,我们可以在调试完前一个步骤后再次恢复执行,方法是单击恢复按钮(显示在已暂停按钮旁边)。

clicking the resume

输出日志现在包含从暂停恢复后执行的所有步骤。

如果我们在浏览器中打开开发者控制台(按 F12),并从测试运行器中选择一个步骤,控制台将显示所用命令和产生值。

例如,对于 setCookie 步骤,控制台显示命令 − setCookie,而产生值显示 cookie 名称 − cookie1 和值 − value1。

setcookie

Cypress - Custom Commands

Cypress 自定义命令由用户描述,而不是 Cypress 中的默认命令。这些自定义命令用于创建在自动化流程中重复的测试步骤。

我们可以添加覆盖已存在的命令。它们应放置在 Cypress 项目中 support 文件夹内的 commands.js 文件中。

cypress project command

Syntax

Cypress 中自定义命令的语法如下 −

Cypress.Commands.add(function-name, func)

Cypress.Commands.add(function-name, opts, func)

Cypress.Commands.overwrite(function-name, func)

在此,

  1. function-name 是正在添加/覆盖的命令。

  2. func 是传递给命令参数的传递函数。

  3. 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

输出如下 −

implementation of actual testing

输出日志显示自定义命令 – userInput (具有 get、type 和 click 命令)正在执行。

建议自定义命令不要太长。它应该简短,因为在自定义命令中添加太多操作往往会显示执行。

Cypress - Fixtures

利用 Cypress 的装置来维护并保存自动化的测试数据。 装置保存在 Cypress 项目中的装置文件夹(example.json 文件)中。基本上,它帮助我们从外部文件读取数据输入。

features

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)

在此,

  1. path of test data 是固定数据文件夹内测试数据文件的路径。

  2. encoding type - 编码类型(utf-8、asci 等)用于读取文件。

  3. 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

输出如下 −

data driven testing in cypress

输出日志显示值 Robert 和 789456123 分别被输入到姓名和手机号码字段。此数据已从装置传递到测试。

Cypress - Environment Variables

我们可以定义环境变量,为测试自动化框架全局声明,并且所有测试用例都可以访问它。这种类型的自定义环境变量可以存储在我们项目内的 cypress.json 文件中。

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

输出如下 −

output logs

输出日志显示了作为 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 如下:

  1. before - 一旦 describe 块内任何测试的先前执行操作执行完毕,就会执行它。

  2. after - 一旦 describe 块内的所有测试的后执行操作执行完毕,就会执行它。

  3. beforeEach - 在执行单个块之前执行它,它阻止 describe 块。

  4. 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

输出如下:

cypress hooks

输出日志显示,首先执行的步骤是 BEFORE ALL。

最后一个执行的步骤是 AFTER ALL。两者都只运行一次。

在每个 BEFORE EACH 下执行的步骤运行两次(在每个 TEST BODY 之前)。

而且,在每个 AFTER EACH 下执行的步骤运行两次(在每个 TEST BODY 之后)。

这两个 it 块按实现的顺序执行。

TAG

除了钩子,Cypress 还有标签 - .only 和 .skip。

而 .only 标签用于执行它所标记的 it 块,.skip 标签则用于排除它所标记的 it 块。

Implementation with .only

only 标签在 Cypress 中的实现如下 −
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

输出如下 −

cypress has tags

输出日志显示带有 .only 标签的 it 块(第一个和第二个测试)只得到了执行。

Implementation with .skip

skip 标签在 Cypress 中的实现如下 −
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

输出如下 −

cypress skip tags

输出日志显示带有 .skip 标签的 it 块(第三个测试)跳过了执行。

Cypress - Configuration of JSON File

Cypress 配置由一些适用于框架内所有测试的键值对组成。Cypress 默认配置可在测试运行器窗口中的“设置”选项卡→“配置”(展开它)下找到。

cypress automation

如果我们在同一窗口中向下看,我们应该看到 Cypress 给出的多个配置的现有值,例如超时、环境变量、文件夹路径等。

它如下所示:

javascript object notation

如果我们在同一窗口中向下看,我们应该看到 Cypress 给出的多个配置的现有值,例如超时、环境变量、文件夹路径等。

它如下所示:

few more configurations javascript object notation

Override Default values

要从 cypress.json 文件覆盖默认配置,我们必须指定键值对。

override default values

Implementation in cypress.json

覆盖 JSON 文件的默认值实现如下:

{
   "baseUrl" : "https://www.google.com/"
}

此处,键是 baseUrl,值是 https://www.google.com/ 。一旦再次运行测试,就会 changes are reflected in the global configurations ,如下所示:

global configurations

Implementation of Actual Test

覆盖 JSON 文件的默认值的实际测试实现如下:

describe('Tutorialspoint', function () {
// test case
   it('First Test', function (){
      // launch application from configuration
      cy.visit("/")
   });
});

Execution Results

输出如下 −

baseurl

执行日志显示 baseUrl 已从 cypress.json 文件获取,并且适用于框架内的所有测试。

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 秒值覆盖。

default command timeout

Cypress - Reports

Cypress 与 Mocha 捆绑在一起。因此,任何可为 Mocha 生成的报告也可用于 Cypress。此外,Cypress 还有其他第三方报告工具,如 JUnit 和 teamcity。

Mochawesome Report

Mochawesome 报告是 Cypress 中最重要的报告之一。

  1. install mochawesome ,运行以下命令:

npm install mochawesome --save-dev

以下屏幕将出现在您的计算机上:

install mochawesome
  1. 要安装 mocha,运行以下命令:

npm install mocha --save-dev

以下屏幕将出现在您的计算机上:

install mocha
  1. merge mochawesome json reports ,运行以下命令:

npm install mochawesome-merge --save-dev

以下屏幕将出现在您的计算机上:

merge mochawesome json reports

安装后,所有这些包都应该反映在 package.json 文件中。

要将多个报告合并为一个报告,运行以下命令:

npm run combine-reports

Configurations in cypress.json file

在 cypress.json 文件中,我们可以为 mochawesome 报告设置以下配置:

  1. overwrite - 如果其值设为 false,则不应该覆盖之前生成的报告。

  2. reportDir - 这是保存报告的位置。

  3. quiet - 如果其值设为 true,则不应该有任何与 Cypress 相关的输出。必须只打印 mochawesome 输出。

  4. html - 如果其值设为 false,则不应该在执行后生成任何 html 报告。

  5. 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 格式的报告。

json formats

右键单击 mochawesome.html 报告。然后,选择复制路径选项,并在浏览器上打开复制的路径。

mochawesome html

mochawsome 报告将以执行结果、持续时间、测试用例名称、测试步骤等的详细信息的形式打开。

单击屏幕左上角的图标(在上图中突出显示),将显示更多选项。

mochawesome report

我们可以获得不同的视图来选择通过、失败、挂起、跳过的测试用例以及应用于测试的钩子。

JUnit Report

Cypress 提供了另一种称为 JUnit 报告的报告类型。

要为 JUnit 报告安装程序包,请运行下面说明的命令:

npm install cypress-junit-reporter --save-dev

以下屏幕将出现在您的计算机上:

junit report

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 project

执行完成后,Cypress项目中会生成一个results文件夹,其中包含xml格式的报告。

teamcity Report

Cypress提供了一种被称为TeamCity的报告的另一种报告类型。

要安装teamcity报告的软件包,请运行以下命令:

npm install cypress-teamcity-reporter --save-dev

以下屏幕将出现在您的计算机上:

teamcity report

要生成Cypress项目中integration文件夹中所有规格的报告,请运行以下命令:

npx cypress run --reporter teamcity

以下屏幕将出现在您的计算机上:

running

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 文件夹内。

Cypress - GitHub

要将 Cypress 与 GitHub 集成,我们必须首先安装 Cypress GitHub App。这可以通过组织集成设置或 Cypress 仪表板中的项目设置完成。

Installation

Cypress GitHub App 的安装可以通过两种方式完成。它们在下面详细解释。

Installation via organization integration settings

按照以下步骤通过组织集成设置安装 GitHub -

  1. 导航到仪表板组织页面。

  2. 选择要与 GitHub 帐户或组织集成的组织。

  3. 从导航到侧面的内容中导航到所选组织的集成选项。

  4. 然后,单击 GitHub 集成按钮。

Installation via project settings

按照以下步骤通过项目设置安装 GitHub -

  1. 在组织切换器内选择组织。

  2. 选择要在 GitHub 中与存储库集成的项目。

  3. 转到项目设置页面。

  4. 转到 GitHub 集成。

  5. 单击“安装 Cypress GitHub 应用”。

完成 GitHub 应用安装后,我们将被重定向到 GitHub.com,以便继续执行以下步骤:

  1. 选择 GitHub 组织或帐户以与组织 Cypress 仪表板集成。

  2. 接下来,我们必须将所有 GitHub 存储库或特定存储库与 Cypress GitHub 应用结合使用。

  3. 单击“安装”按钮完成安装。

GitHub Integration Enabling

下面介绍了在 Cypress 中启用 GitHub 集成的流程:

  1. 转到项目设置页面。

  2. 导航到 GitHub 集成部分,然后单击“配置”。

  3. 从 GitHub 中选择一个存储库以与项目集成。

  4. 当 GitHub 存储库连接到 Cypress 项目时,将启用 GitHub 集成。