概要
最近Cypressを触る機会があったのでよく使う関数をまとめてみました。
またなにか覚えたら追記しようと思います。
よく使う関数
ページ遷移する
cy.visit
でURLを指定してページ遷移します。
cy.vist('http://localhost')
cypress.config.ts
にbaseUrlを指定していると、baseUrlからのサブディレクトリを指定してページ遷移できます。
export default defineConfig({
e2e: {
baseUrl: 'http://localhost',
},
});
cy.vist('/'); // 'http://localhost'に遷移する
要素を取得する
cy.get
やcy.contains
で要素を取得できます。
cy.get
cy.get
でセレクタを指定して要素を取得できます。
cy.get('input')
cy.get('button')
cy.get('input')
cy.get('[type="radio"]')
もちろん、同一セレクタの要素が複数あれば複数個の要素が取得されます。
最初の1つを取得したいときはfirst
が使えます。
cy.get('input').first()
2つ目以降を取得したいときはeq
を使います。
cy.get('input').eq(0) // 1つ目
cy.get('input').eq(1) // 2つ目
cy.get('input').eq(2) // 3つ目
cy.contains
cy.contains
を使うと引数に一致するテキストを持つ最初の要素が取得できます。
正規表現も使用可能です。
cy.contains('text')
以下のような場面で便利です。
- 特定のページが表示されてるかをタイトルなどで判断する
- クリックしたいリンクやボタンを中身のテキストで判断する
-
get
と組み合わせるのもOK
-
- プルダウンメニューで特定の要素を選択する
要素を操作する
click
, check
, type
などで要素を操作できます。
cy.get('button').first().click() // クリック
cy.get('[type="radio"]').first().check() // チェック
cy.get('input').first().type('ほげ') // テキスト入力
検証する
should
を使うとレンダリングの結果を検証できます。
cy.contains('タイトル').should('exist');
ページの表示を待つ
ページ遷移の直後に要素を操作しようとすると、ページの表示が完了していないため操作に失敗することがあります。
そんなときは、should('be.visible')
を使ってページの表示を待つことができます。
cy.contains('タイトル', { timeout: 10000 })
.should('be.visible')
.get('input', { timeout: 10000 })
.should('be.visible')
.then(() => {
cy.get('input').eq(0).type('ほげ');
cy.get('input').eq(1).type('ふが');
});
ここではshould('be.visible')
を2回書いてますが、
-
contains('タイトル').should('be.visible')
のみ- inputが表示されないため操作に失敗する
-
get('input').should('be.visible')
のみ- 遷移前のinputに対して操作しようとして失敗する
というようなことが頻発したのでこのようにしています。
ドメインをまたいで変数を保持する
現在のページとは異なるドメインのページに遷移すると、Cypressのテストコード上で定義した変数の中身が消えてしまいます。
let hoge: string;
it(() => {
cy.visit('http://localhost')
hoge = 'hoge';
});
it(() => {
cy.visit('http://localhost:81')
console.log(hoge) // 'hoge'が表示されずundefinedになる
});
こんなときはcy.task
を使用します。
認証のトークンを保持したいときなどに使うことになると思います。
使い方としては
-
cypress.config.ts
にtaskを定義する - テストコードで定義した関数を
cy.task
経由で呼び出す
といった形になります。
let value: string;
export default defineConfig({
e2e: {
setupNodeEvents(on, config) {
on('task', {
setValue(v: string) {
value = v;
return null;
},
getValue() {
return value;
},
});
},
},
});
it(() => {
cy.visit('http://localhost');
cy.task('setValue', 'hoge');
});
it(() => {
cy.visit('http://localhost:81');
cy.task('getValue').then((value) => {
console.log(value); // 'hoge'と表示される
});
});
ちなみに、cy.task
について検索するとplugins/index.ts
で定義する方法がよく出てきますが、これは最新(v10.0.0以降)のCypressでは動かないので注意です。