Skip to content

Commit

Permalink
Improve compatibility with other driver (#15)
Browse files Browse the repository at this point in the history
* Improve compatibility with other driver

* fix changes in test config
  • Loading branch information
christian-bromann authored Apr 7, 2022
1 parent feb83fd commit 3d63bb5
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 19 deletions.
1 change: 1 addition & 0 deletions src/constants.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import path from 'path'
import type { ArgsParams, VSCodeProxyOptions } from './types'

export const VSCODE_CAPABILITY_KEY = 'wdio:vscodeOptions' as const
export const DEFAULT_CHANNEL = 'stable'
export const VSCODE_APPLICATION_ARGS: ArgsParams = {
// https://github.com/microsoft/vscode/issues/84238
Expand Down
24 changes: 11 additions & 13 deletions src/launcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import type { Options, Capabilities } from '@wdio/types'
import { validatePlatform, fileExist } from './utils'
import {
DEFAULT_CHANNEL, VSCODE_RELEASES, VSCODE_MANIFEST_URL, CHROMEDRIVER_RELEASES,
CHROMEDRIVER_DOWNLOAD_PATH, DEFAULT_CACHE_PATH
CHROMEDRIVER_DOWNLOAD_PATH, DEFAULT_CACHE_PATH, VSCODE_CAPABILITY_KEY
} from './constants'
import type {
ServiceOptions, ServiceCapability, VSCodeCapabilities, VSCodeOptions
Expand Down Expand Up @@ -49,6 +49,8 @@ export default class VSCodeServiceLauncher extends ChromedriverServiceLauncher {
) {
super(_options, capabilities, config)
this._cachePath = this._options.cachePath || DEFAULT_CACHE_PATH
// @ts-expect-error overwrite private method
this._mapCapabilities = () => {}
}

async onPrepare (_: never, capabilities: Capabilities.RemoteCapabilities) {
Expand All @@ -71,22 +73,16 @@ export default class VSCodeServiceLauncher extends ChromedriverServiceLauncher {
continue
}

if (!cap['wdio:vscodeOptions']) {
cap['wdio:vscodeOptions'] = <VSCodeOptions>{}
if (!cap[VSCODE_CAPABILITY_KEY]) {
cap[VSCODE_CAPABILITY_KEY] = <VSCodeOptions>{}
}

/**
* need to rename capability back to Chrome otherwise Chromedriver
* as well as the service won't recognise this capability
*/
cap.browserName = 'chrome'
const version = cap.browserVersion || DEFAULT_CHANNEL

if (versionsFileExist) {
const content = JSON.parse((await fs.readFile(versionsFilePath)).toString()) as Versions
const chromedriverPath = path.join(this._cachePath, `chromedriver-${content[version]?.chromedriver}`)
const vscodePath = (
cap['wdio:vscodeOptions']?.binary
cap[VSCODE_CAPABILITY_KEY]?.binary
|| path.join(this._cachePath, `vscode-${process.platform}-${content[version]?.vscode}`)
)

Expand All @@ -96,7 +92,8 @@ export default class VSCodeServiceLauncher extends ChromedriverServiceLauncher {
+ `and Chromedriver v${content[version]?.chromedriver} already exist`
)

cap['wdio:vscodeOptions'].binary = await this._setupVSCode(content[version]!.vscode)
Object.assign(cap, this.options)
cap[VSCODE_CAPABILITY_KEY]!.binary = await this._setupVSCode(content[version]!.vscode)
this.chromedriverCustomPath = chromedriverPath
continue
}
Expand All @@ -108,10 +105,11 @@ export default class VSCodeServiceLauncher extends ChromedriverServiceLauncher {
chromedriver: { version: chromedriverVersion, path: chromedriverPath },
vscode: {
version: vscodeVersion,
path: cap['wdio:vscodeOptions']?.binary || await this._setupVSCode(vscodeVersion)
path: cap[VSCODE_CAPABILITY_KEY]?.binary || await this._setupVSCode(vscodeVersion)
}
}
cap['wdio:vscodeOptions'].binary = serviceArgs.vscode.path
Object.assign(cap, this.options)
cap[VSCODE_CAPABILITY_KEY]!.binary = serviceArgs.vscode.path
await this._updateVersionsTxt(version, serviceArgs, versionsFileExist)
}

Expand Down
33 changes: 28 additions & 5 deletions src/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ import { Services, Options } from '@wdio/types'
import { SevereServiceError } from 'webdriverio'

import { Workbench } from './pageobjects'
import { getLocators, getValueSuffix } from './utils'
import { getLocators, getValueSuffix, isVSCodeCapability } from './utils'
import {
VSCODE_APPLICATION_ARGS, DEFAULT_VSCODE_SETTINGS, DEFAULT_PROXY_OPTIONS,
SETTINGS_KEY
SETTINGS_KEY, VSCODE_CAPABILITY_KEY
} from './constants'
import type {
VSCodeCapabilities, WDIOLogs, ArgsParams, RemoteCommand, RemoteResponse,
Expand All @@ -32,7 +32,7 @@ export default class VSCodeWorkerService implements Services.ServiceInstance {
private _vscodeOptions: VSCodeOptions

constructor (_: never, private _capabilities: VSCodeCapabilities) {
this._vscodeOptions = this._capabilities['wdio:vscodeOptions'] || <VSCodeOptions>{}
this._vscodeOptions = this._capabilities[VSCODE_CAPABILITY_KEY] || <VSCodeOptions>{}
this._proxyOptions = { ...DEFAULT_PROXY_OPTIONS, ...this._vscodeOptions.vscodeProxyOptions }
}

Expand All @@ -54,6 +54,13 @@ export default class VSCodeWorkerService implements Services.ServiceInstance {
}

async beforeSession (_: Options.Testrunner, capabilities: VSCodeCapabilities) {
/**
* only run setup for VSCode capabilities
*/
if (!isVSCodeCapability(capabilities)) {
return
}

const customArgs: ArgsParams = { ...VSCODE_APPLICATION_ARGS }
const storagePath = await tmp.dir()
const userSettingsPath = path.join(storagePath.path, 'settings', 'User')
Expand Down Expand Up @@ -120,12 +127,24 @@ export default class VSCodeWorkerService implements Services.ServiceInstance {
],
[] as string[]
)

/**
* need to rename capability back to Chrome otherwise Chromedriver
* won't recognise this capability
*/
capabilities.browserName = 'chrome'
capabilities['goog:chromeOptions'] = { binary, args, windowTypes: ['webview'] }
log.info(`Start VSCode: ${binary} ${args.join(' ')}`)
}

async before (capabilities: VSCodeCapabilities, __: never, browser: WebdriverIO.Browser) {
/**
* only run setup for VSCode capabilities
*/
if (!isVSCodeCapability(capabilities)) {
return
}

this._browser = browser
const locators = await getLocators(capabilities.browserVersion || 'insiders')
const workbenchPO = new Workbench(locators)
Expand All @@ -135,11 +154,15 @@ export default class VSCodeWorkerService implements Services.ServiceInstance {
this._browser.addCommand('getVSCodeChannel', () => (
capabilities.browserVersion === 'insiders' ? 'insiders' : 'vscode'
))
return workbenchPO.elem.waitForExist()
await workbenchPO.elem.waitForExist()
}

async after () {
if (!this._browser || !this._capabilities['wdio:vscodeOptions']?.verboseLogging) {
if (
!isVSCodeCapability(this._capabilities)
|| !this._browser
|| !this._capabilities[VSCODE_CAPABILITY_KEY]?.verboseLogging
) {
return
}

Expand Down
3 changes: 2 additions & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { ChromedriverServiceOptions } from 'wdio-chromedriver-service'
import type { Capabilities } from '@wdio/types'
import type { VSCODE_CAPABILITY_KEY } from './constants'

/**
* Settings to handle VSCode Proxy API
Expand Down Expand Up @@ -99,7 +100,7 @@ export interface VSCodeOptions {
}

export interface VSCodeCapabilities extends Capabilities.Capabilities {
'wdio:vscodeOptions'?: VSCodeOptions
[VSCODE_CAPABILITY_KEY]?: VSCodeOptions
}

export interface WDIOLogs {
Expand Down
6 changes: 6 additions & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ import fs from 'fs/promises'
import path from 'path'
import child_process from 'child_process'

import { VSCODE_CAPABILITY_KEY } from './constants'
import type { VSCodeLocatorMap } from './pageobjects/utils'
import type { VSCodeCapabilities } from './types'

function isEmulatedRosettaEnvironment () {
const archName = child_process.spawnSync('uname', ['-m']).stdout.toString().trim()
Expand Down Expand Up @@ -84,3 +86,7 @@ export function getValueSuffix (value: string | boolean) {
}
return `=${value}`
}

export function isVSCodeCapability (cap: VSCodeCapabilities) {
return Boolean(cap[VSCODE_CAPABILITY_KEY])
}

0 comments on commit 3d63bb5

Please sign in to comment.