รัน Jasmine ด้วย Browser IE ผ่าน Karma

ปัญหาการใช้งาน IE ยังไม่จบไม่สิ้น คราวที่แล้วเป็นเรื่องรัน robot framework บน IE รอบนี้มาเจอปัญหารัน javascript unit test บน IE

javascript unit test ที่ใช้เป็น jasmine รันด้วย karma test runner บน Windows server 2012 ปัญหาที่เจอรอบนี้คือ เปิด IE ไม่ขึ้นเฉพาะตอนรันผ่าน jenkins (แต่ถ้ารัน manual ไม่เจอปัญหานี้)

เริ่มจากวิธีการตั้งค่าให้ karma หันมาใช้ IE ก่อน ด้วยการ install karma-ie-launcher ก่อน (ในตัวอย่างใช้ yarn แทนที่จะใช้ npm ถ้าใช้ npm ก็ไปดูคำสั่ง npm เอา)

yarn add --save-dev karma-ie-launcher

หรือถ้าใช้ npm ก็ตามนี้

npm install --save-dev karma-ie-launcher

เสร็จแล้วใน karma.conf.js ก็แก้เป็นประมาณนี้

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular/cli'],
    plugins: [
      require('karma-jasmine'),
      require('karma-ie-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular/cli/plugins/karma')
    ],
    client:{
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      reports: [ 'html', 'lcovonly' ],
      fixWebpackSourcePaths: true
    },
    angularCli: {
      environment: 'dev'
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['IE'],
    singleRun: false
  });
};

เสร็จแล้วก็รันเลย

yarn run ng test

หรือ

npm run test

ถ้าเป็น manual ทุกอย่างก็ดูโอเคดี แต่พอรันผ่าน jenkins มันไม่ใช่อย่างที่คิด

อ้าวเฮ้ย ปัญหามาอีกแล้ว ลอง google ดู​ มีคนแนะนำให้ปิด Automatic Crash Recovery ใน IE ก็ลองแล้ว แต่ไม่หาย (มีหลายคนหาย อาจจะเกิดจากคนละกรณี)

ไป google เพิ่มเติมก็เจอว่า มันเกิดจาก พฤติกรรมที่เปลี่ยนไปของ karma-ie-launcher ที่เดิมเวลามันเปิด IE มันจะใส่ flag ที่เป็น –extoff มาให้ด้วย แต่ในเวอร์ชั่นหลัง ๆ มันไม่ใส่มาให้ ดังนั้นเราต้องใส่เองโดยการแก้ใน karma.conf.js

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular/cli'],
    plugins: [
      require('karma-jasmine'),
      require('karma-ie-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular/cli/plugins/karma')
    ],
    client:{
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      reports: [ 'html', 'lcovonly' ],
      fixWebpackSourcePaths: true
    },
    angularCli: {
      environment: 'dev'
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['IE_no_addons'],
    singleRun: false,
    customLaunchers: {
      IE_no_addons: {
        base:  'IE',
        flags: ['-extoff']
      }
    }
  });
};

พอเสร็จแล้วรันใหม่ด้วยวิธี manual ดู ก็ไม่ติดปัญหาอะไร ลองเปลี่ยนมารันบน jenkins … Error ใหม่มาแล้วจ้า … สัส!!

เรื่องเก่าหายไปแล้ว เรื่องใหม่ มาอีกแล้ว ไปหาวิธีแก้ต่อ ก็ไปเจอวิธีแก้ปัญหาที่ดูน่าสนใจมาอีกวิธีตามนี้

  1. โหลด PsExec มาจาก https://technet.microsoft.com/en-us/sysinternals/bb897553
  2. รันคำสั่ง psexec -s -i “%programfiles%\Internet Explorer\iexplore.exe”
  3. มันจะเปิด IE ขึ้นมา IE มันจะถามโน่นนี่นั่น เหมือนเปิด IE มาใหม่ ๆ  ก็ไป Set ค่าต่าง ๆ ที่ IE ตามที่มันถามให้เรียบร้อย
  4. ปิด IE
  5. เรียบร้อยแล้ว

เสร็จแล้วลองรันใหม่อีกที เฮ้ย หายแล้ว!!

จบ

อ้างอิง

  • http://ccm.net/faq/14976-internet-explorer-enabling-disabling-the-automatic-crash-recovery-feature
  • https://github.com/karma-runner/karma-ie-launcher#running-ie-in-no-add-ons-mode
  • https://rostacik.net/2017/06/12/my-karma-tests-are-failing-in-ie-on-my-jenkins-and-i-dont-know-why/

Leave a Reply