WebDriverIo 4 с Chrome headless не работает

Среда

  • ОС: MacOS Mojave 10.14.6
  • Хром: 77.0.3865.90
  • WebDriverIo: 4.13.2
  • Автономный Selenium: 6.16.0

Проблема

Я работаю над тестированием Frontend e2e. Когда начинается мое тестирование, оно должно начинаться со страницы приветствия.

Так что мой wdio.e2e.conf.jsконфигурация будет

// wdio.e2e.conf.js

exports.config = {
  ...
  baseUrl: 'my-website.com'
  ...
}

затем я бегу в терминал

wdio wdio.e2e.conf.js

Браузер Chrome открывается, но адресная строка data:, вместо того https://my-website.com.

Поэтому я заставляю перейти на желаемую страницу.

// my-test-steps.js

Given('I am on welcome page', () => {
  browser.url('/'); // force to go to the welcome page
  browser.waitForVisible("welcome-component", 10000);
})

Затем браузер наконец открывает правильный URL, и все мои тестовые примеры проходят отлично.

Однако когда я запускаю тот же тест на headless режим, он работает не так, как я ожидал.

Error [ERR_IPC_CHANNEL_CLOSED]: channel closed
    at process.target.send (internal/child_process.js:578:16)
    at /Users/ME/workspace/e2e-test/node_modules/webdriverio/build/lib/runner.js:498:25
    at execHook (/Users/ME/workspace/e2e-test/node_modules/wdio-sync/build/index.js:162:35)

Что я тестировал

1.

Сначала я проверил browser.url('/'); часть.

// my-test-steps.js

Given('I am on welcome page', () => {
  console.log('before url', browser.getUrl()); // 1. get current URL

  browser.url('/'); // force to go to the welcome page

  console.log('after url', browser.getUrl());  // 2. get current URL after url update

  browser.waitForVisible("welcome-component", 10000);

})
  1. Если это не безголовый режим: оба console.logнапечатаны.
  2. Если это безголовый режим: первый console.logпечатается, но не второй. И получите таймаут:
ERROR: ESOCKETTIMEDOUT
chrome
    at new RuntimeError (/Users/ME/workspace/e2e-test/node_modules/webdriverio/build/lib/utils/ErrorHandler.js:143:12)
    at Request._callback (/Users/ME/workspace/e2e-test/node_modules/webdriverio/build/lib/utils/RequestHandler.js:342:43)
    at self.callback (/Users/ME/workspace/e2e-test/node_modules/request/request.js:185:22)
    at emitOne (events.js:116:13)
    at Request.emit (events.js:211:7)
    at ClientRequest.<anonymous> (/Users/ME/workspace/e2e-test/node_modules/request/request.js:819:16)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:106:13)
    at ClientRequest.emit (events.js:208:7)
    at Socket.emitTimeout (_http_client.js:718:34)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:106:13)
    at Socket.emit (events.js:208:7)
    at Socket._onTimeout (net.js:422:8)
    at ontimeout (timers.js:498:11)
    at tryOnTimeout (timers.js:323:5)

Похоже, что это, browser.url() не работает в безголовом режиме.

2.

Но я знаю, что использую browser.url() для решения проблемы с data:,не идеальный способ. Поэтому я попытался решить эту проблему.

Я обнаружил, что Chrome показывает "данные:" в адресной строке, и попытался обновить свойchromedriver в selenium-standalone. (Я использую Chrome 77)

Но не повезло.

3.

Может быть, я смогу попробовать WebDriverIo 5, но я уже сделал огромный тестовый код. Переход на v5 не идеален сейчас, но позже.

4.

Теперь я не знаю, с чего начать на это смотреть. Любой комментарий был бы полезен. Спасибо.

Мой "wdio.e2e.conf.js"

const chai = require('chai');

exports.config = {
  specs: [
    './test/e2e/my-test.feature',
  ],
  exclude: [],
  maxInstances: 1,
  capabilities: [
    {
      maxInstances: 1,
      browserName: 'chrome',
      chromeOptions: {
        args: [
          '--disable-web-security',
          '--no-sandbox',
          '--headless',
          '--window-size=1280,800',
          '--disable-gpu',
        ],
        mobileEmulation: {
          deviceName: 'iPhone X',
        },
      },
    },
  ],
  sync: true,
  logLevel: 'silent',
  coloredLogs: true,
  deprecationWarnings: true,
  bail: 0,
  screenshotPath: './test/e2e/errorShots',
  baseUrl: 'https://my-website.com',
  waitforTimeout: 20000,
  connectionRetryTimeout: 20000,
  connectionRetryCount: 3,
  plugins: {
    'wdio-webcomponents': {},
  },
  services: ['selenium-standalone'],
  seleniumLogs: './test/selenium-logs',
  seleniumArgs: {
    drivers: {
      chrome: {
        version: '77.0.3865.40',
      },
    },
  },
  seleniumInstallArgs: {
    version: '3.141.59',
    baseURL: 'https://selenium-release.storage.googleapis.com',
    drivers: {
      chrome: {
        version: '77.0.3865.40',
        arch: process.arch,
        baseURL: 'https://chromedriver.storage.googleapis.com',
      },
    },
  },
  framework: 'cucumber',
  reporters: ['dot', 'spec'], // 'multiple-cucumber-html'
  reporterOptions: {
    htmlReporter: {
      jsonFolder: './test/e2e/reports/multiple',
      reportFolder: './test/e2e/reports/multiple/html',
    },
  },
  cucumberOpts: {
    require: [
      './test/e2e/step-definitions/my-test-steps.js',
      './test/e2e/steps/when.js',
      './test/e2e/steps/then.js',
    ],
    backtrace: false,
    compiler: ['js:babel-core/register'],
    dryRun: false,
    failFast: false,
    format: ['pretty'],
    colors: true,
    snippets: true,
    source: true,
    profile: [],
    strict: false,
    tags: [],
    timeout: 20000,
    ignoreUndefinedDefinitions: false,
  },


  onPrepare(config, capabilities) { // eslint-disable-line no-unused-vars
    config.skipSeleniumInstall = true; // eslint-disable-line no-param-reassign
    process.env.BABEL_CACHE_PATH = `${process.env.HOME}/Documents/.babel.json`;
  },

  before(capabilities, specs) { // eslint-disable-line no-unused-vars
    global.expect = chai.expect;
    global.assert = chai.assert;
    global.should = chai.should(); // eslint-disable-line global-require
  },
};

0 ответов

Другие вопросы по тегам