Nightwatch.나는 js에서 PageObject를 시도했다.

수고하셨습니다.@naokiur.
제가 Selenide로 PageObject를 했었어요.
Vue.js를 사용하는 동시에
해봤어Nightwatch.jsでPageObject.

컨디션

  • MacBook Pro (Retina 13-inch、Early 2015)
  • OS X El Capitan 10.13.6
  • node v8.12.0
  • npm 6.4.1
  • 실시된 일


    간단한 화면 준비入力して内容を表示する나는 그것에 대해 테스트 코드를 썼다.
    위의 텍스트 상자에 값을 입력하고send를 클릭한 후
    아래 텍스트 상자에 반영합니다.

    자기가 말해도 그래요.
    진부한 그림이네.
    화면과 테스트 코드는 다음과 같다.

    테스트 대상 화면


    TestTarget.vue
    <template>
      <div>
        <section>
          <input type="text" name="inputData" v-model="inputData" placeholder="please enter some test!" />
        </section>
        <section>
          <input type="button" value="send" @click="send" />
        </section>
        <section>
          <input type="text" name="resultData" :value="result" />
        </section>
      </div>
    </template>
    
    <script>
      export default {
        name: 'testTarget',
        data () {
          return {
            inputData: '',
            result: 'before'
          }
        },
        methods: {
          send: function () {
            this.result = this.inputData
          }
        }
      }
    </script>
    
    <style scoped>
    
    </style>
    
    

    테스트 코드


    test.js
    module.exports = {
      'input test': function (browser) {
        const targetPage = browser.page.testTargetPage()
    
        targetPage.navigate()
          .assert.visible('@inputData')
          .setValue('@inputData', 'test')
          .send()
          .assert.value('@resultData', 'test')
    
        browser.end()
      } 
    }
    
    
    testTargetPage.js
    const pageCommands = {
        send: function () {
            return this.waitForElementVisible('@sendButton', 1000)
                .click('@sendButton') 
        }
    }
    
    module.exports = {
        commands: [pageCommands],
        url: function () {
            return this.api.globals.devServerURL
        },
        elements: {
            inputData: {
                selector: 'input[name=inputData]'
            },
            sendButton: {
                selector: 'input[type=button]'
            },
            resultData: {
                selector: 'input[name=resultData]'
            }
        }
    }
    
    nightwatch.conf.js
    require('babel-register')
    var config = require('../../config')
    
    module.exports = {
      src_folders: ['test/e2e/specs'],
      output_folder: 'test/e2e/reports',
      custom_assertions_path: ['test/e2e/custom-assertions'],
      page_objects_path: ['test/e2e/pageObjects'],
    
      selenium: {
        start_process: true,
        server_path: require('selenium-server').path,
        host: '127.0.0.1',
        port: 4444,
        cli_args: {
          'webdriver.chrome.driver': require('chromedriver').path
        }
      },
    
      test_settings: {
        default: {
          selenium_port: 4444,
          selenium_host: 'localhost',
          silent: true,
          globals: {
            devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port)
          }
        },
    
        chrome: {
          desiredCapabilities: {
            browserName: 'chrome',
            javascriptEnabled: true,
            acceptSslCerts: true
          }
        },
    
        firefox: {
          desiredCapabilities: {
            browserName: 'firefox',
            javascriptEnabled: true,
            acceptSslCerts: true
          }
        }
      }
    }
    
    

    디렉토리 구조

    project_root
        |- src
            |- page
                |- TestTarget.vue
        |- test
            |- e2e
                |- pageObjects
                    |- testTargetPage.js
                |- specs
                    |- test.js
                |- nightwatch.conf.js
    
    

    푹 빠진 곳

  • .assert.visible('@inputData') 실패!

  • 까먹었어navigate(), 원래 방문 안 했어
  • 공식적으로 보듯이 testTargetPage.js에commond를 썼는데 this.waitForElementVisible is not function!

  • https://github.com/nightwatchjs/nightwatch/issues/1629와 같습니다.목록의 구성은 어떻습니까?
  • 결실

  • PageObject 모드를 반영하여 테스트 코드를 많이 쓴 후 DOM의 구성이 바뀌었더라도 PageObject를 고쳐 쓰면 된다.
  • Command를 생성하고 배치하여 테스트 코드의 선명도를 향상시킵니다.
  • 샘플의 화면이 너무 간단해서 이해하기 어려울 수도 있지만 더 많은 화면을 만들면 장점을 알 수 있기를 기대합니다.
  • 참고할게요.

  • http://nightwatchjs.org/
  • https://github.com/nightwatchjs/nightwatch/issues/1629
  • 좋은 웹페이지 즐겨찾기