프런트 엔드 테스트 도구 비교 Puppeteer #02 테스트
소개
지난번 에서 puppetter 환경 구축이 완료되었습니다.
Selenium 환경 구축 보다 극적으로 간단하고 감동했어요.
이번은 계속 우에다 , 소궁 하지만,
기본적인 브라우저의 기능을 puppeteer로 구현해 움직여 봅니다.
함께 Selenium 반도 동일한 테스트를 수행합니다.
대하는 셀레늄 반
프런트 엔드 테스트 도구 비교 Selenium #02 테스트 편
* 시무라 , 모토키
수행할 조작 절차
검증을 위한 소스
이번에는 샘플로 React로 만든 SPA 테스트용 페이지를 준비했습니다.
링크 대상의 구축 순서에 따라 준비해 주세요.
로그인 화면 조작
로그인 화면
테스트 케이스

・로그인 화면 열기 ・타이틀의 어설션, 캡쳐 ・입력 폼에 onfocus, 배경색 변경 후에 캡쳐 ・ID와 패스워드를 입력하지 않고, 로그인 버튼을 클릭 와 패스워드를 입력, 캡쳐 입력값 ID:takedaPassword:shinji·로그인 버튼을 클릭
로그인 후 목록 화면 조작
목록 화면
테스트 케이스

· 로그인 후 목록 화면으로 전환하여 ID/비밀번호 어설 션 및 캡처 목록에 다음 요소를 등록하여 캡처 (입력 한 내용이 화면에 링크로 반영됨) 입력 값 : javascript, ruby, scala 목록의 순서를 바꾸어 캡처
다른 탭 조작
브라우저 백 포워드 조작
테스트 코드
위에서 준비한 테스트 케이스를 망라할 수 있는 테스트 코드를 써 갑니다.
script.js
const puppeteer = require('puppeteer');
const loginUrl = 'http://***/' // テストするURL
const pageTitle = 'React Test';
const id = 'takeda';
const pw = 'shinji';
const inputList = ['javascript', 'ruby', 'scala'];
// ログイン画面の操作
async function phase1(page) {
console.log('start phase1');
// ログインページに遷移する
await page.goto(loginUrl);
// @TODO titleのアサーション →puppeteerではアサーションは未実装
await page.screenshot({ path: 'image/01_home_first.png' });
// input#idにフォーカスを当てる
await page.click('#id_input');
await page.screenshot({ path: 'image/02_home_focused.png' });
// ログインエラーでモーダルを出し、閉じる
await page.click('#login_button');
await page.waitForSelector('#error_label');
await page.screenshot({ path: 'image/03_login_failed.png' });
await page.click('#close_button');
// id,passwordを入力する
await page.type('#id_input', id);
await page.type('#pass_input', pw);
await page.screenshot({ path: 'image/04_home_input.png' });
// loginボタンを押下してページ遷移
await page.click('#login_button');
// 特定のDOMレンダリングを待つ
await page.waitForSelector('#text_input');
console.log('ログインに成功しました');
}
// リスト画面の操作
async function phase2(page) {
console.log('start phese2');
// ログイン完了後スクリーンショット
await page.screenshot({ path: 'image/11_list_first.png' });
// リストを登録
for (let value of inputList) {
await page.type('#text_input', value);
await page.click('#regist_button');
}
await page.waitFor(500);
// リストを追加後スクリーンショットを撮る
await page.screenshot({ path: 'image/12_list_addlist.png' });
// @TODO リストの一番上を一番したに移動させる
}
// 別タブの操作
async function phase3(page, browser) {
console.log('start phase3');
// 別タブリンクをクリック
await page.click('#blank_link');
await page.waitFor(1000);
// 新しいタブを操作
const pages = await browser.pages();
const page2 = pages[2];
await page2.bringToFront();
await page2.waitFor(500);
// 新しく開いたページをスクリーンショット
await page2.screenshot({ path: 'image/21_tab_first.png' });
// 新しく開いたタブを閉じて、スクリーンショット
await page2.close();
await page.screenshot({ path: 'image/22_tab_return.png' });
}
// ブラウザバックの操作
async function phase4(page) {
console.log('start phase4');
// リストのリンクをクリック
await page.click('#list_label3 h3 a');
await page.waitFor(500);
await page.screenshot({ path: 'image/31_list_link.png' });
// @TODO リスト画面に戻る
// @TODO 再度リンク先へ進む
}
(async () => {
const browser = await puppeteer.launch({
args: [
'--no-sandbox',
'--disable-setuid-sandbox'
]
});
// 新規ページを開く
const page = await browser.newPage();
// 画面サイズの指定
page.setViewport({ width: 500, height: 500 });
await phase1(page);
await phase2(page);
await phase3(page, browser);
await phase4(page);
// ページを閉じる
browser.close();
console.log('end puppeter');
})();
결과
크게는 이하 3개의 테스트에 대해서 실시할 수 없었습니다.
mouse.up()
의 불편(?)에 의해 구현 불가. 관련 이슈이것들이 해결할 수 있는 분, 보다 좋은 실장 방법을 알고 있는 분, 교수해 주세요! !
Puppeteer는 아직 최근 메이저 버전이 1을 타고 있기 때문에 앞으로 기대하네요! !
Creaith 회원
이 문서의 저자 : 우에다, 소궁
기타 회원: 시무라 , 모토키
Reference
이 문제에 관하여(프런트 엔드 테스트 도구 비교 Puppeteer #02 테스트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/creaith/items/cde0cbf56c88021b534d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)