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);
})
- Если это не безголовый режим: оба
console.log
напечатаны. - Если это безголовый режим: первый
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
},
};