프런트 엔드 테스트 도구 비교 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개의 테스트에 대해서 실시할 수 없었습니다.
  • 어설션에 대해서는 puppetter의 기능으로는 할 수 없기 때문에 생략. node 패키지를 별도로 준비하십시오. (Selenium과 같은 테스트 도구가 아니기 때문에 어떻게해야합니까?)
  • 드래그 앤 드롭에 대해서는, puppetter의 API인 mouse.up() 의 불편(?)에 의해 구현 불가. 관련 이슈
  • 브라우저백에 대해서는, 관련 이슈

    이것들이 해결할 수 있는 분, 보다 좋은 실장 방법을 알고 있는 분, 교수해 주세요! !
    Puppeteer는 아직 최근 메이저 버전이 1을 타고 있기 때문에 앞으로 기대하네요! !

    Creaith 회원



    이 문서의 저자 : 우에다, 소궁
    기타 회원: 시무라 , 모토키

    좋은 웹페이지 즐겨찾기