Cypress簡易入門教程

01

Windows下安裝

方法一

① 安裝node.js(https://nodejs.org/en/download/),根據(jù)版本選擇32位或64位熟史。

② 確認(rèn)ndejs?和npm是否安裝上:

C:\Users\xiang>node -v

v12.18.0

C:\Users\xiang>npm-v

6.14.

③ 生成package.json(假設(shè)準(zhǔn)備安裝在c:\Cypress>)

C:\Users\xiang>cd c:\Cypress

C:\Cypress>npminit

④ 安裝Cypress

C:\Cypress>npm install cypress --save-dev

方法二

① 安裝yarn (https://yarnpkg.com/en/docs/install#windows-stable)

② 確認(rèn)yarn是否安裝上

C:\Users\xiang>yarn -v

1.22.4

③ 安裝Cypress

C:\Users\xiang>cd c:\Cypress

C:\Cypress>yarnadd cypress --dev

02

運(yùn)行

方法一

C:\Cypress\node_modules\.bin>cypress open

方法二

C:\Cypress>yarn run cypress open

方法三(我經(jīng)常用的方法)

配置C:\Cypress\package.json

{

"license": "ISC",

"scripts": {

"cypress:open": "cypress open",

"cypress:run": "cypress run"

? },

"devDependencies": {

"cypress": "^4.8.0"

? }

}

打開運(yùn)行控制器

C:\Cypress>yarn run cypress open

運(yùn)行默認(rèn)路徑下的所有測試代碼

C:\Cypress>yarn run cypress run

默認(rèn)路徑為C:\Cypress\cypress\integration焚鹊,可以通過

{

? …

"integrationFolder": "cypress/integration/demo",

}

改變默認(rèn)路徑,上述代碼中默認(rèn)路徑改為

C:\Cypress\cypress\integration\demo

03

測試框架&代碼案例

before():

相當(dāng)于unittest中的def setUp(cls)方法或者Junit的@Before方法標(biāo)簽;

after():

相當(dāng)于unittest中的?def teardown(cls)?方法或者Junit的 @Before方法標(biāo)簽譬正;

beforeEach()?:

相當(dāng)于unittest中的def setUpClass(cls)?方法或者Junit的@BeforeClass方法標(biāo)簽疫赎;

afterEach()?:

相當(dāng)于unittest中的def tearDownClass(cls)?方法或者Junit的@AfterClass方法標(biāo)簽盛撑。

GUI測試代碼案例

1、第一個測試代碼

測試電子商務(wù)系統(tǒng)登錄程序

describe('login',function(){

const username = 'cindy'

const password = '123456'

context('測試電子商務(wù)網(wǎng)站',function(){

it('登錄成功捧搞,調(diào)到商品列表頁面',function(){

cy.visit('http://127.0.0.1:8000')

cy.get('input[name=username]').type(username)

cy.get('input[name=password]').type(password)

? cy.get('form').submit()

? ? ? //斷言

cy.url().should('include','/goods_view')

? cy.get('title').should('contain','電子商務(wù)系統(tǒng)')

? ? ?})??

? ? })

})

2抵卫、元素查找 - get

<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">

根據(jù)元素 id?查找

cy.get('#kw')

根據(jù)元素名稱查找

cy.get('input[name="wd"]')

根據(jù)元素的類名查找

cy.get('.s_ipt')

根據(jù)CSS selector查找、

cy.get('input[maxlength ="100"]')

3胎撇、元素查找 – contains

根據(jù)元素文本查找

cy.contains('value')??

根據(jù)元素屬性及其文本查找

cy.get('div[name="ele-name"]').contains('value')

使用正則匹配元素文本以查找

cy.get('.class-name').contains(/[0-9]*/)

4介粘、操作

type(String)、輸入晚树,比如

cy.get('#kw'). type('Testing')

click()姻采、點(diǎn)擊,比如

cy.get('.btn'). click ()

clear()爵憎、清空input或textarea的內(nèi)容慨亲,比如

cy.get('.ant-input').clear()

submit()、提交表單纲堵,比如

cy.get('.ant-form').submit()

dblclick()巡雨、元素雙擊,比如

cy.get('.ant-btn').dblclick()

rightclick()席函、元素右擊铐望,比如

cy.get('.ant-btn').rightclick()

select(String)、對元素選擇,比如

cy.get('.ant-select').select('apples')

check()正蛙、勾選checkbox督弓,比如

cy.get('.ant-checkbox').check()

Uncheck、反選 checkbox乒验,比如

cy.get('.ant-checkbox').uncheck()

scrollIntoView()愚隧、如果某個元素不在當(dāng)前可視范圍,可以滑動至可視范圍锻全,比如

cy.get('#id').scrollIntoView()

scrollTo(String)狂塘、指定位置滑動,比如

cy.scrollTo('bottom')鳄厌、cy.get('#id').scrollTo(250, 250)

5荞胡、鼠標(biāo)操作

鼠標(biāo)懸停事件:

cy.get('button').trigger('mouseover')

鼠標(biāo)按下:

cy.get('button').trigger('mousedown')

鼠標(biāo)抬起:

cy.get('button').trigger('mouseleave')

cy.get('button').trigger('mouseup')

鼠標(biāo)長按事件:

cy.get('button').trigger('mousedown')

cy.wait(1000)

cy.get('button').trigger('mouseleave')

鼠標(biāo)拖拽事件

cy.get('[data-cy=draggable]')

.trigger('mousedown', {which:1,pageX:600,pageY:100})

.trigger('mousemove', {which:1,pageX:600,pageY:600 })

.trigger('mouseup')

describe('baidu',function(){

context('測試百度網(wǎng)站',function(){

it('查詢成功',function(){

? cy.visit('https://www.baidu.com')

cy.get('input[name=wd]').type("軟件測試")

cy.get('#su').click()

? cy.get('title').should('contain','百度搜索')

? ? ?})?

it('進(jìn)入高級查詢成功',function(){

cy.get('a[name=tj_settingicon]').trigger('mouseover')

cy.get('.bdpfmenu').should('exist')

? ? ?})??

? })

})

6、斷言

針對長度的斷言

cy.get('li.selected').should('have.length',3)

針對類的斷言

cy.get('from').fijd('input').should('not.have.class','disabled')

針對值斷言

cy.get('textarea').should('have.value','3testing')

針對文本內(nèi)容的斷言

cy.get('a').parent('span.help').should('contain','click me')

針對元素可見與否的斷言

cy.get('button').should('be.visible')

針對元素存在與否的斷言

cy.get('#loading').should('not.exist')

針對元素狀態(tài)的State的斷言

cy.get(':radio').should('be.checked')

針對CSS的斷言

cy.get('.completed').should('have.css','text-decoration','line-through')

7了嚎、跨iframe操作

describe('login',function(){

context('啄木鳥',function(){

it('點(diǎn)擊我的介紹成功',function(){

cy.visit('http://www.3testing.com')

cy.get('#head',{timeout: 2000})

.then($iframe=> {

cy.wrap($iframe.contents().find("#introduce"));

? ? ? ? ? ? })

? .then($btn =>{

? cy.wrap($btn).click()

? ? ? ? ? ? });

? ? ? //斷言

cy.url().should('include','introduce.html')

cy.get('title').should('contain','啄木鳥')

? ? ?})??

? })

})

8泪漂、多窗口操作

Cypress不支持多窗口操作。

04

API測試

1歪泳、普通API測試

describe('login',function(){

const username = 'cindy'

const password = '123456'

const producturl="http://127.0.0.1:8000/login_action/"

cy.request({

method: 'POST',

url:producturl,

body: {

username:username

password:password

}

? ? ? })

? })

2萝勤、CSRF token API測試

describe('login',function(){

const username = 'cindy'

const password = '123456'

const producturl="http://127.0.0.1:8000/login_action/"

Cypress.Commands.add('loginByCSRF', (csrfToken) => {

cy.request({

method: 'POST',

url:producturl,

failOnStatusCode:false, // 不要失敗,這樣我們才能斷言

form:true, // 我們正在提交一份常規(guī)表格

body: {

username,

password,

csrfmiddlewaretoken:csrfToken // 將此作為主體的一部分插入

? ? ? ? }

? ? ? })

? })

? // csrf在返回的html中,我測試的Django產(chǎn)品的CSRF token用這種方法

it('策略#1:從HTML解析令牌', function(){

? ? // 如果我們不能改變我們的服務(wù)器代碼以使解析CSRF令牌變得更容易呐伞,

? ? // 我們可以簡單地使用cy.request來獲取登錄頁面敌卓,然后解析HTML內(nèi)容

? ? // 以找到嵌入在頁面中的CSRF令牌

cy.request(producturl)

? .its('body')

? .then((body) => {

? ? ? ? //我們可以用Cypress.$解析字符串主體,從而使我們能夠輕松地查詢到它

cy.log(body)

const $html =Cypress.$(body)

const csrf? = $html.find("input[name=csrfmiddlewaretoken]").val()

cy.loginByCSRF(csrf)

.then((resp) => {

expect(resp.status).to.eq(200)

expect(resp.body).to.contain("Company 2017")

? ? ? ? ? })

? ? ? })

? ? })

? })

/*

? // 如果csrf在響應(yīng)頭中

it('策略#2:從響應(yīng)頭解析令牌',function(){

? ? // 如果我們將csrf令牌嵌入到響應(yīng)頭中荸哟,那么我們就可以更容易地提取它,

? ? // 而不必深究最終的HTML

cy.request(producturl)

.its('headers')

.then((headers) => {

const csrf =headers['csrftoken']

cy.log(csrf)

cy.loginByCSRF(csrf)

.then((resp) => {

expect(resp.status).to.eq(200)

expect(resp.body).to.contain("Company 2017")

? ? ? ? ? })

? ? ? })

? ? })

? ?}) */

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末假哎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鞍历,更是在濱河造成了極大的恐慌舵抹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劣砍,死亡現(xiàn)場離奇詭異惧蛹,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)刑枝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門香嗓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人装畅,你說我怎么就攤上這事靠娱。” “怎么了掠兄?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵像云,是天一觀的道長锌雀。 經(jīng)常有香客問我,道長迅诬,這世上最難降的妖魔是什么腋逆? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮侈贷,結(jié)果婚禮上惩歉,老公的妹妹穿的比我還像新娘。我一直安慰自己俏蛮,他們只是感情好撑蚌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搏屑,像睡著了一般锨并。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睬棚,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音解幼,去河邊找鬼抑党。 笑死,一個胖子當(dāng)著我的面吹牛撵摆,可吹牛的內(nèi)容都是我干的底靠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼特铝,長吁一口氣:“原來是場噩夢啊……” “哼暑中!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鲫剿,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤鳄逾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后灵莲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雕凹,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年政冻,在試婚紗的時候發(fā)現(xiàn)自己被綠了枚抵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡明场,死狀恐怖汽摹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苦锨,我是刑警寧澤逼泣,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布趴泌,位于F島的核電站,受9級特大地震影響圾旨,放射性物質(zhì)發(fā)生泄漏踱讨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一砍的、第九天 我趴在偏房一處隱蔽的房頂上張望痹筛。 院中可真熱鬧,春花似錦廓鞠、人聲如沸帚稠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滋早。三九已至,卻和暖如春砌们,著一層夾襖步出監(jiān)牢的瞬間杆麸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工浪感, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昔头,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓影兽,卻偏偏與公主長得像揭斧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子峻堰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容