Add option for Internet Explorer IE11 to FTR (#42967)

* Add option for Internet Explorer IE11

* WIP trying to figure out IE options/capabilities

* more attempts to get IE tests working

* more work, but still can't set font size in Dev Tools Console

* two changes for IE

* revert skip in console test

* this change *appears* to set absolute times but they don't stick

* Shakespeare passing on all 3 browsers

* add config.ie.js, change 'internet explorer' to 'ie'

* increase notifications:lifetime so ew have a chance to see the message

* fix lint error remove unused Options

* updates from PR review, remove console.log

* cleanup + reuse existing code

* make iedriver path work for x-pack tests

* try to avoid changing notification timeout

* resolve path and add correct delimiter

* remove unused code, make timepicker work on IE11

* work-around 45333 for IE11

* [WIP] removing some work-arounds

* revert work-arounds

* cleanup

* remove debugging code

* remove debugging code

* removed unused code

* reverting 2 files that didn't have any material changes
This commit is contained in:
Lee Drengenberg 2019-10-04 11:13:58 -05:00 committed by GitHub
parent 2ae7915810
commit 700a7ef576
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 331 additions and 47 deletions

View file

@ -397,6 +397,7 @@
"gulp-babel": "^8.0.0",
"gulp-sourcemaps": "2.6.5",
"has-ansi": "^3.0.0",
"iedriver": "^3.14.1",
"image-diff": "1.6.3",
"intl-messageformat-parser": "^1.4.0",
"is-path-inside": "^2.1.0",

View file

@ -134,7 +134,7 @@ export const schema = Joi.object()
browser: Joi.object()
.keys({
type: Joi.string()
.valid('chrome', 'firefox')
.valid('chrome', 'firefox', 'ie')
.default('chrome'),
logPollingMs: Joi.number().default(100),

View file

@ -46,7 +46,11 @@ export default function({ getService, getPageObjects }: FtrProviderContext) {
it('should show the default request', async () => {
// collapse the help pane because we only get the VISIBLE TEXT, not the part that is scrolled
await PageObjects.console.collapseHelp();
// on IE11, the dialog that says 'Your browser does not meet the security requirements for Kibana.'
// blocks the close help button for several seconds so just retry until we can click it.
await retry.try(async () => {
await PageObjects.console.collapseHelp();
});
await retry.try(async () => {
const actualRequest = await PageObjects.console.getRequest();
log.debug(actualRequest);

View file

@ -26,6 +26,7 @@ export default function ({ getService, getPageObjects }) {
const appsMenu = getService('appsMenu');
const esArchiver = getService('esArchiver');
const retry = getService('retry');
const kibanaServer = getService('kibanaServer');
const fromTime = '2015-09-19 06:31:44.000';
const toTime = '2015-09-23 18:31:44.000';
@ -33,8 +34,15 @@ export default function ({ getService, getPageObjects }) {
before(async () => {
await esArchiver.loadIfNeeded('makelogs');
await browser.refresh();
await PageObjects.header.awaitKibanaChrome();
if (browser.isInternetExplorer) {
await kibanaServer.uiSettings.replace({ 'state:storeInSessionStorage': false });
}
});
after(async () => {
if (browser.isInternetExplorer) {
await kibanaServer.uiSettings.replace({ 'state:storeInSessionStorage': true });
}
});
// FLAKY: https://github.com/elastic/kibana/issues/33468

View file

@ -26,7 +26,7 @@ export default function ({ getService, getPageObjects }) {
describe('chart types', function () {
before(function () {
log.debug('navigateToApp visualize');
return PageObjects.common.navigateToUrl('visualize', 'new');
return PageObjects.visualize.navigateToNewVisualization();
});
it('should show the correct chart types', async function () {

View file

@ -0,0 +1,55 @@
/*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
export default async function ({ readConfigFile }) {
const defaultConfig = await readConfigFile(require.resolve('./config'));
return {
...defaultConfig.getAll(),
browser: {
type: 'ie',
},
junit: {
reportName: 'Internet Explorer UI Functional Tests'
},
uiSettings: {
defaults: {
'accessibility:disableAnimations': true,
'dateFormat:tz': 'UTC',
'telemetry:optIn': false,
'state:storeInSessionStorage': true,
'notifications:lifetime:info': 10000,
},
},
kbnTestServer: {
...defaultConfig.get('kbnTestServer'),
serverArgs: [
...defaultConfig.get('kbnTestServer.serverArgs'),
'--csp.strict=false',
],
},
};
}

View file

@ -25,7 +25,7 @@ export function TimePickerPageProvider({ getService, getPageObjects }) {
const find = getService('find');
const browser = getService('browser');
const testSubjects = getService('testSubjects');
const PageObjects = getPageObjects(['header']);
const PageObjects = getPageObjects(['header', 'common']);
class TimePickerPage {
@ -48,18 +48,6 @@ export function TimePickerPageProvider({ getService, getPageObjects }) {
await find.waitForElementStale(panelElement);
}
async setAbsoluteStart(startTime) {
await this.showStartEndTimes();
await testSubjects.click('superDatePickerstartDatePopoverButton');
const panel = await this.getTimePickerPanel();
await testSubjects.click('superDatePickerAbsoluteTab');
await this.inputValue('superDatePickerAbsoluteDateInput', startTime);
await testSubjects.click('superDatePickerstartDatePopoverButton');
await this.waitPanelIsGone(panel);
await PageObjects.header.awaitGlobalLoadingIndicatorHidden();
}
/**
* @param {String} commonlyUsedOption 'superDatePickerCommonlyUsed_This_week'
*/
@ -73,6 +61,13 @@ export function TimePickerPageProvider({ getService, getPageObjects }) {
const input = await testSubjects.find(dataTestsubj);
await input.clearValue();
await input.type(value);
} else if (browser.isInternetExplorer) {
const input = await testSubjects.find(dataTestsubj);
const currentValue = await input.getAttribute('value');
await input.type((browser.keys.ARROW_RIGHT).repeat(currentValue.length));
await input.type((browser.keys.BACK_SPACE).repeat(currentValue.length));
await input.type(value);
await input.click();
} else {
await testSubjects.setValue(dataTestsubj, value);
}
@ -90,14 +85,16 @@ export function TimePickerPageProvider({ getService, getPageObjects }) {
await testSubjects.click('superDatePickerendDatePopoverButton');
let panel = await this.getTimePickerPanel();
await testSubjects.click('superDatePickerAbsoluteTab');
await testSubjects.click('superDatePickerAbsoluteDateInput');
await this.inputValue('superDatePickerAbsoluteDateInput', toTime);
await PageObjects.common.sleep(500);
// set from time
await testSubjects.click('superDatePickerstartDatePopoverButton');
await this.waitPanelIsGone(panel);
panel = await this.getTimePickerPanel();
await testSubjects.click('superDatePickerAbsoluteTab');
await testSubjects.click('superDatePickerAbsoluteDateInput');
await this.inputValue('superDatePickerAbsoluteDateInput', fromTime);
const superDatePickerApplyButtonExists = await testSubjects.exists('superDatePickerApplyTimeButton');
@ -148,6 +145,7 @@ export function TimePickerPageProvider({ getService, getPageObjects }) {
if (isShowDatesButton) {
await testSubjects.click('superDatePickerShowDatesButton');
}
await testSubjects.exists('superDatePickerstartDatePopoverButton');
}
async getRefreshConfig(keepQuickSelectOpen = false) {

View file

@ -718,8 +718,9 @@ export function VisualizePageProvider({ getService, getPageObjects, updateBaseli
log.debug('Click Save Visualization button');
await testSubjects.click('confirmSaveSavedObjectButton');
// if we wait for this, the success toast message could be gone :-()
// wait for save to complete before completion
await PageObjects.header.waitUntilLoadingHasFinished();
// await PageObjects.header.waitUntilLoadingHasFinished();
}
async saveVisualizationExpectSuccess(vizName, { saveAsNew = false } = {}) {
@ -834,7 +835,7 @@ export function VisualizePageProvider({ getService, getPageObjects, updateBaseli
// by a bunch of 'L'ines from that point to the next. Those points are
// the values we're going to use to calculate the data values we're testing.
// So git rid of the one 'M' and split the rest on the 'L's.
const tempArray = data.replace('M', '').split('L');
const tempArray = data.replace('M ', '').replace('M', '').replace(/ L /g, 'L').replace(/ /g, ',').split('L');
const chartSections = tempArray.length / 2;
// log.debug('chartSections = ' + chartSections + ' height = ' + yAxisHeight + ' yAxisLabel = ' + yAxisLabel);
const chartData = [];
@ -888,7 +889,7 @@ export function VisualizePageProvider({ getService, getPageObjects, updateBaseli
// 1). get the range/pixel ratio
const yAxisRatio = await this.getChartYAxisRatio(axis);
// 3). get the visWrapper__chart elements
const svg = await find.byCssSelector('div.chart > svg');
const svg = await find.byCssSelector('div.chart');
const $ = await svg.parseDomContent();
const chartData = $(`g > g.series > rect[data-label="${dataLabel}"]`).toArray().map(chart => {
const barHeight = $(chart).attr('height');

View file

@ -68,6 +68,8 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
public readonly isFirefox: boolean = browserType === Browsers.Firefox;
public readonly isInternetExplorer: boolean = browserType === Browsers.InternetExplorer;
/**
* Is WebDriver instance W3C compatible
*/
@ -181,7 +183,12 @@ export async function BrowserProvider({ getService }: FtrProviderContext) {
*/
public async getCurrentUrl(): Promise<string> {
// strip _t=Date query param when url is read
const current = await driver.getCurrentUrl();
let current: string;
if (this.isInternetExplorer) {
current = await driver.executeScript('return window.document.location.href');
} else {
current = await driver.getCurrentUrl();
}
const currentWithoutTime = modifyUrl(current, parsed => {
delete (parsed.query as any)._t;
return void 0;

View file

@ -75,7 +75,7 @@ export function ComboBoxProvider({ getService, getPageObjects }: FtrProviderCont
return;
}
comboBoxElement.scrollIntoViewIfNecessary();
await comboBoxElement.scrollIntoViewIfNecessary();
await this.setFilterValue(comboBoxElement, value);
await this.openOptionsList(comboBoxElement);

View file

@ -63,7 +63,7 @@ export function InspectorProvider({ getService }: FtrProviderContext) {
if (!isOpen) {
await retry.try(async () => {
await testSubjects.click('openInspectorButton');
await testSubjects.find('inspectorPanel');
await testSubjects.exists('inspectorPanel');
});
}
}

View file

@ -233,6 +233,9 @@ export class WebElementWrapper {
* @default { withJS: false }
*/
async clearValue(options: ClearOptions = { withJS: false }) {
if (this.browserType === Browsers.InternetExplorer) {
return this.clearValueWithKeyboard();
}
await this.retryCall(async function clearValue(wrapper) {
if (wrapper.browserType === Browsers.Chrome || options.withJS) {
// https://bugs.chromium.org/p/chromedriver/issues/detail?id=2702
@ -249,6 +252,16 @@ export class WebElementWrapper {
* @default { charByChar: false }
*/
async clearValueWithKeyboard(options: TypeOptions = { charByChar: false }) {
if (this.browserType === Browsers.InternetExplorer) {
const value = await this.getAttribute('value');
// For IE testing, the text field gets clicked in the middle so
// first go HOME and then DELETE all chars
await this.pressKeys(this.Keys.HOME);
for (let i = 0; i <= value.length; i++) {
await this.pressKeys(this.Keys.DELETE);
}
return;
}
if (options.charByChar === true) {
const value = await this.getAttribute('value');
for (let i = 0; i <= value.length; i++) {

View file

@ -20,4 +20,5 @@
export enum Browsers {
Chrome = 'chrome',
Firefox = 'firefox',
InternetExplorer = 'ie',
}

View file

@ -27,6 +27,8 @@ import { Builder, Capabilities, By, Key, logging, until } from 'selenium-webdriv
import chrome from 'selenium-webdriver/chrome';
// @ts-ignore types not available
import firefox from 'selenium-webdriver/firefox';
// @ts-ignore types not available
import ie from 'selenium-webdriver/ie';
// @ts-ignore internal modules are not typed
import { LegacyActionSequence } from 'selenium-webdriver/lib/actions';
// @ts-ignore internal modules are not typed
@ -34,6 +36,7 @@ import { Executor } from 'selenium-webdriver/lib/http';
// @ts-ignore internal modules are not typed
import { getLogger } from 'selenium-webdriver/lib/logging';
import { resolve, delimiter } from 'path';
import { preventParallelCalls } from './prevent_parallel_calls';
import { Browsers } from './browsers';
@ -89,6 +92,7 @@ async function attemptToCreateCommand(log: ToolingLog, browserType: Browsers) {
.withCapabilities(chromeCapabilities)
.setChromeService(new chrome.ServiceBuilder(chromeDriver.path).enableVerboseLogging())
.build();
case 'firefox':
const firefoxOptions = new firefox.Options();
if (headlessBrowser === '1') {
@ -100,6 +104,30 @@ async function attemptToCreateCommand(log: ToolingLog, browserType: Browsers) {
.setFirefoxOptions(firefoxOptions)
.setFirefoxService(new firefox.ServiceBuilder(geckoDriver.path).enableVerboseLogging())
.build();
case 'ie':
// https://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/ie_exports_Options.html
const driverPath = resolve(
__dirname,
'..\\..\\..\\..\\node_modules\\iedriver\\lib\\iedriver'
);
process.env.PATH = driverPath + delimiter + process.env.PATH;
const ieCapabilities = Capabilities.ie();
ieCapabilities.set('se:ieOptions', {
'ie.ensureCleanSession': true,
ignoreProtectedModeSettings: true,
ignoreZoomSetting: false, // requires us to have 100% zoom level
nativeEvents: true, // need this for values to stick but it requires 100% scaling and window focus
requireWindowFocus: true,
logLevel: 'TRACE',
});
return new Builder()
.forBrowser(browserType)
.withCapabilities(ieCapabilities)
.build();
default:
throw new Error(`${browserType} is not supported yet`);
}

View file

@ -0,0 +1,81 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
export default async function ({ readConfigFile }) {
const defaultConfig = await readConfigFile(require.resolve('./config'));
return {
...defaultConfig.getAll(),
//csp.strict: false
// testFiles: [
// require.resolve(__dirname, './apps/advanced_settings'),
// require.resolve(__dirname, './apps/canvas'),
// require.resolve(__dirname, './apps/graph'),
// require.resolve(__dirname, './apps/monitoring'),
// require.resolve(__dirname, './apps/watcher'),
// require.resolve(__dirname, './apps/dashboard'),
// require.resolve(__dirname, './apps/dashboard_mode'),
// require.resolve(__dirname, './apps/discover'),
// require.resolve(__dirname, './apps/security'),
// require.resolve(__dirname, './apps/spaces'),
// require.resolve(__dirname, './apps/lens'),
// require.resolve(__dirname, './apps/logstash'),
// require.resolve(__dirname, './apps/grok_debugger'),
// require.resolve(__dirname, './apps/infra'),
// require.resolve(__dirname, './apps/machine_learning'),
// require.resolve(__dirname, './apps/rollup_job'),
// require.resolve(__dirname, './apps/maps'),
// require.resolve(__dirname, './apps/status_page'),
// require.resolve(__dirname, './apps/timelion'),
// require.resolve(__dirname, './apps/upgrade_assistant'),
// require.resolve(__dirname, './apps/code'),
// require.resolve(__dirname, './apps/visualize'),
// require.resolve(__dirname, './apps/uptime'),
// require.resolve(__dirname, './apps/saved_objects_management'),
// require.resolve(__dirname, './apps/dev_tools'),
// require.resolve(__dirname, './apps/apm'),
// require.resolve(__dirname, './apps/index_patterns'),
// require.resolve(__dirname, './apps/index_management'),
// require.resolve(__dirname, './apps/index_lifecycle_management'),
// require.resolve(__dirname, './apps/snapshot_restore'),
// require.resolve(__dirname, './apps/cross_cluster_replication'),
// require.resolve(__dirname, './apps/remote_clusters'),
// // This license_management file must be last because it is destructive.
// require.resolve(__dirname, './apps/license_management'),
// ],
browser: {
type: 'ie',
},
junit: {
reportName: 'Internet Explorer UI Functional X-Pack Tests'
},
uiSettings: {
defaults: {
'accessibility:disableAnimations': true,
'dateFormat:tz': 'UTC',
'telemetry:optIn': false,
'state:storeInSessionStorage': true,
},
},
kbnTestServer: {
...defaultConfig.get('kbnTestServer'),
serverArgs: [
...defaultConfig.get('kbnTestServer.serverArgs'),
'--csp.strict=false',
],
},
};
}

View file

@ -19,7 +19,7 @@ export function InfraHomePageProvider({ getService }: FtrProviderContext) {
const datePickerInput = await find.byCssSelector(
`${testSubjSelector('waffleDatePicker')} .euiDatePicker.euiFieldText`
);
await datePickerInput.type(Array(30).fill(browser.keys.BACK_SPACE));
await datePickerInput.clearValueWithKeyboard({ charByChar: true });
await datePickerInput.type([time, browser.keys.RETURN]);
},

129
yarn.lock
View file

@ -4592,6 +4592,11 @@ adm-zip@0.4.11:
resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.11.tgz#2aa54c84c4b01a9d0fb89bb11982a51f13e3d62a"
integrity sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==
adm-zip@^0.4.13:
version "0.4.13"
resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.13.tgz#597e2f8cc3672151e1307d3e95cddbc75672314a"
integrity sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==
affine-hull@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/affine-hull/-/affine-hull-1.0.0.tgz#763ff1d38d063ceb7e272f17ee4d7bbcaf905c5d"
@ -8369,6 +8374,15 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
concat-stream@1.6.0, concat-stream@^1.4.7, concat-stream@~1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=
dependencies:
inherits "^2.0.3"
readable-stream "^2.2.2"
typedarray "^0.0.6"
concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.5.0, concat-stream@^1.6.1:
version "1.6.2"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
@ -8379,15 +8393,6 @@ concat-stream@1.6.2, concat-stream@^1.4.6, concat-stream@^1.5.0, concat-stream@^
readable-stream "^2.2.2"
typedarray "^0.0.6"
concat-stream@^1.4.7, concat-stream@~1.6.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
integrity sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=
dependencies:
inherits "^2.0.3"
readable-stream "^2.2.2"
typedarray "^0.0.6"
concat-stream@~1.5.0:
version "1.5.2"
resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
@ -8416,6 +8421,14 @@ config-chain@^1.1.11:
ini "^1.3.4"
proto-list "~1.2.1"
config-chain@~1.1.8:
version "1.1.12"
resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
dependencies:
ini "^1.3.4"
proto-list "~1.2.1"
configstore@^1.0.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-1.4.0.tgz#c35781d0501d268c25c54b8b17f6240e8a4fb021"
@ -11928,6 +11941,16 @@ extract-stack@^1.0.0:
resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-1.0.0.tgz#b97acaf9441eea2332529624b732fc5a1c8165fa"
integrity sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo=
extract-zip@1.6.6:
version "1.6.6"
resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c"
integrity sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=
dependencies:
concat-stream "1.6.0"
debug "2.6.9"
mkdirp "0.5.0"
yauzl "2.4.1"
extract-zip@1.6.7, extract-zip@^1.6.6, extract-zip@^1.6.7:
version "1.6.7"
resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9"
@ -13788,6 +13811,11 @@ graceful-fs@^4.2.0, graceful-fs@^4.2.2:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.2.tgz#6f0952605d0140c1cfdb138ed005775b92d67b02"
integrity sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==
graceful-fs@~1.1:
version "1.1.14"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.1.14.tgz#07078db5f6377f6321fceaaedf497de124dc9465"
integrity sha1-BweNtfY3f2Mh/Oqu30l94STclGU=
graceful-fs@~1.2.0:
version "1.2.3"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364"
@ -15021,6 +15049,20 @@ idx@^2.5.2:
resolved "https://registry.yarnpkg.com/idx/-/idx-2.5.2.tgz#4b405c2e6d68d04136e0a368a7ab35b9caa0595f"
integrity sha512-MLoGF4lQU5q/RqJJjRsuid52emu7tPVtSSZaYXsqRvSjvXdBEmIwk2urvbNvPBRU9Ox9I4WYnxiz2GjhU34Lrw==
iedriver@^3.14.1:
version "3.14.1"
resolved "https://registry.yarnpkg.com/iedriver/-/iedriver-3.14.1.tgz#447c49be83c62d3f2f158283d58ccf7b35002be8"
integrity sha512-YyCi703BGK7R37A8QlSe2B87xgwDGGoPqBrlXe4Q68o/MNLJrR53/IpTs6J1+KKk51MLiTbWa57N7P3KZ11tow==
dependencies:
adm-zip "^0.4.13"
extract-zip "1.6.6"
kew "~0.1.7"
md5-file "^1.1.4"
mkdirp "0.3.5"
npmconf "^2.1.3"
request "^2.88.0"
rimraf "~2.0.2"
ieee754@^1.1.4:
version "1.1.8"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
@ -15226,7 +15268,7 @@ inherits@2.0.1:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
ini@^1.2.0, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0:
version "1.3.5"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
@ -17402,6 +17444,11 @@ kdbush@^3.0.0:
resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-3.0.0.tgz#f8484794d47004cc2d85ed3a79353dbe0abc2bf0"
integrity sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==
kew@~0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/kew/-/kew-0.1.7.tgz#0a32a817ff1a9b3b12b8c9bacf4bc4d679af8e72"
integrity sha1-CjKoF/8amzsSuMm6z0vE1nmvjnI=
keymirror@0.1.1, keymirror@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/keymirror/-/keymirror-0.1.1.tgz#918889ea13f8d0a42e7c557250eee713adc95c35"
@ -18802,6 +18849,11 @@ material-colors@^1.2.1:
resolved "https://registry.yarnpkg.com/material-colors/-/material-colors-1.2.5.tgz#5292593e6754cb1bcc2b98030e4e0d6a3afc9ea1"
integrity sha1-UpJZPmdUyxvMK5gDDk4Najr8nqE=
md5-file@^1.1.4:
version "1.1.10"
resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-1.1.10.tgz#d8f4fce76c92cb20b7d143a59f58ca49b4cf3174"
integrity sha1-2PT852ySyyC30UOln1jKSbTPMXQ=
md5.js@^1.3.4:
version "1.3.4"
resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
@ -19368,6 +19420,18 @@ mixin-object@^2.0.1:
for-in "^0.1.3"
is-extendable "^0.1.1"
mkdirp@0.3.5, mkdirp@^0.3.5, mkdirp@~0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=
mkdirp@0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
integrity sha1-HXMHam35hs2TROFecfzAWkyavxI=
dependencies:
minimist "0.0.8"
mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
@ -19375,11 +19439,6 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi
dependencies:
minimist "0.0.8"
mkdirp@^0.3.5, mkdirp@~0.3.5:
version "0.3.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7"
integrity sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=
mobx-react@^5.4.3:
version "5.4.3"
resolved "https://registry.yarnpkg.com/mobx-react/-/mobx-react-5.4.3.tgz#6709b7dd89670c40e9815914ac2ca49cc02bfb47"
@ -20160,7 +20219,7 @@ nodemailer@^4.7.0:
chalk "~0.4.0"
underscore "~1.6.0"
"nopt@2 || 3", nopt@3.x, nopt@~3.0.6:
"nopt@2 || 3", nopt@3.x, nopt@~3.0.1, nopt@~3.0.6:
version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
@ -20307,6 +20366,22 @@ npm-run-path@^3.0.0:
dependencies:
path-key "^3.0.0"
npmconf@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/npmconf/-/npmconf-2.1.3.tgz#1cbe5dd02e899d365fed7260b54055473f90a15c"
integrity sha512-iTK+HI68GceCoGOHAQiJ/ik1iDfI7S+cgyG8A+PP18IU3X83kRhQIRhAUNj4Bp2JMx6Zrt5kCiozYa9uGWTjhA==
dependencies:
config-chain "~1.1.8"
inherits "~2.0.0"
ini "^1.2.0"
mkdirp "^0.5.0"
nopt "~3.0.1"
once "~1.3.0"
osenv "^0.1.0"
safe-buffer "^5.1.1"
semver "2 || 3 || 4"
uid-number "0.0.5"
"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2, npmlog@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
@ -24620,6 +24695,13 @@ rimraf@^3.0.0:
dependencies:
glob "^7.1.3"
rimraf@~2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.0.3.tgz#f50a2965e7144e9afd998982f15df706730f56a9"
integrity sha1-9QopZecUTpr9mYmC8V33BnMPVqk=
optionalDependencies:
graceful-fs "~1.1"
ripemd160@^2.0.0, ripemd160@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
@ -25083,6 +25165,11 @@ semver-truncate@^1.0.0:
dependencies:
semver "^5.3.0"
"semver@2 || 3 || 4", semver@^4.1.0:
version "4.3.6"
resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=
"semver@2 || 3 || 4 || 5", semver@^5.3.0:
version "5.4.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e"
@ -25098,11 +25185,6 @@ semver@5.7.0, semver@^5.4.1, semver@^5.6.0, semver@^5.7.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
semver@^4.1.0:
version "4.3.6"
resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=
semver@^5.5.1:
version "5.5.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477"
@ -28161,6 +28243,11 @@ ui-select@0.19.8:
resolved "https://registry.yarnpkg.com/ui-select/-/ui-select-0.19.8.tgz#74860848a7fd8bc494d9856d2f62776ea98637c1"
integrity sha1-dIYISKf9i8SU2YVtL2J3bqmGN8E=
uid-number@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.5.tgz#5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e"
integrity sha1-Wj2yPvXb1VuB/ODsmirG/M3ruB4=
ultron@~1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c"