Skip to content

Commit

Permalink
port #5351
Browse files Browse the repository at this point in the history
  • Loading branch information
christian-bromann committed May 25, 2020
1 parent 6120218 commit d8fccd7
Show file tree
Hide file tree
Showing 22 changed files with 147 additions and 97 deletions.
11 changes: 9 additions & 2 deletions docs/BrowserObject.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Besides all commands from the [API](API.md), the `browser` object provides some
console.log(browser.sessionId) // outputs: "57b15c6ea81d0edb9e5b372da3d9ce28"
console.log(browser.capabilities)
/**
* outputs:
* outputs capabilities returned by the browser driver, e.g.:
{ acceptInsecureCerts: false,
acceptSslCerts: false,
applicationCacheEnabled: false,
Expand Down Expand Up @@ -43,11 +43,18 @@ console.log(browser.capabilities)
version: '68.0.3440.106',
webStorageEnabled: true }
*/
console.log(browser.requestedCapabilities)
/**
* outputs original capabilities set by the user, e.g.:
* {
* browserName: 'chrome'
* }
*/
```

## Get Config Options

You can always define custom options within your WDIO config:
If using the WDIO testrunner you can always define custom options within your WDIO config:

```js
// wdio.conf.js
Expand Down
18 changes: 7 additions & 11 deletions packages/devtools/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ export default class DevTools {
const sessionId = uuidv4()
const [browserName, browserVersion] = (await browser.version()).split('/')

/**
* save original set of capabilities to allow to request the same session again
* (e.g. for reloadSession command in WebdriverIO)
*/
params.requestedCapabilities = { ...params.capabilities }

params.capabilities = {
browserName,
browserVersion,
Expand All @@ -36,15 +42,6 @@ export default class DevTools {
)
}

/**
* save original set of capabilities to allow to request the same session again
* (e.g. for reloadSession command in WebdriverIO)
*/
params.requestedCapabilities = {
w3cCaps: params.capabilities,
jsonwpCaps: params.capabilities
}

sessionMap.set(sessionId, { browser, session: driver })
const environmentPrototype = { getPuppeteer: { value: /* istanbul ignore next */ () => browser } }
Object.entries(devtoolsEnvironmentDetector({ browserName })).forEach(([name, value]) => {
Expand All @@ -60,8 +57,7 @@ export default class DevTools {

static async reloadSession (instance) {
const { session } = sessionMap.get(instance.sessionId)
const { w3cCaps } = instance.options.requestedCapabilities
const browser = await launch(w3cCaps)
const browser = await launch(instance.requestedCapabilities)
const pages = await browser.pages()

session.elementStore.clear()
Expand Down
15 changes: 1 addition & 14 deletions packages/devtools/tests/__snapshots__/devtools.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,6 @@ Object {

exports[`newSession 2`] = `
Object {
"jsonwpCaps": Object {
"browserName": "Chrome",
"browserVersion": "78.0.3881.0",
"goog:chromeOptions": Object {
"debuggerAddress": "localhost:49375",
},
},
"w3cCaps": Object {
"browserName": "Chrome",
"browserVersion": "78.0.3881.0",
"goog:chromeOptions": Object {
"debuggerAddress": "localhost:49375",
},
},
"browserName": "chrome",
}
`;
2 changes: 1 addition & 1 deletion packages/wdio-sync/webdriverio-core.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -590,7 +590,7 @@ declare namespace WebdriverIO {
script?: number
}

interface Browser {
interface Browser extends WebDriver.BaseClient {
config: Config;
options: RemoteOptions;

Expand Down
2 changes: 1 addition & 1 deletion packages/wdio-sync/webdriverio.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ declare namespace WebdriverIO {
executeAsync: (script: string | ((...arguments: any[]) => void), ...arguments: any[]) => any;
}

interface BrowserObject extends WebDriver.ClientOptions, WebDriver.Client, WebdriverIO.Browser { }
interface BrowserObject extends WebDriver.ClientOptions, WebDriver.BaseClient, WebDriver.Client, WebdriverIO.Browser { }
}

declare var browser: WebdriverIO.BrowserObject;
Expand Down
2 changes: 1 addition & 1 deletion packages/wdio-utils/src/envDetector.js
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ export function sessionEnvironmentDetector ({ capabilities, requestedCapabilitie
isMobile: isMobile(capabilities),
isIOS: isIOS(capabilities),
isAndroid: isAndroid(capabilities),
isSauce: isSauce(requestedCapabilities.w3cCaps.alwaysMatch),
isSauce: isSauce(requestedCapabilities),
isSeleniumStandalone: isSeleniumStandalone(capabilities)
}
}
Expand Down
5 changes: 5 additions & 0 deletions packages/wdio-utils/src/monad.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,13 @@ export default function WebDriver (options, modifier, propertiesObject = {}) {
* WebDriver monad
*/
function unit (sessionId, commandWrapper) {
/**
* capabilities attached to the instance prototype not being shown if
* logging the instance
*/
propertiesObject.commandList = { value: Object.keys(propertiesObject) }
propertiesObject.options = { value: options }
propertiesObject.requestedCapabilities = { value: options.requestedCapabilities }

/**
* allow to wrap commands if necessary
Expand Down
26 changes: 13 additions & 13 deletions packages/wdio-utils/tests/envDetector.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ describe('sessionEnvironmentDetector', () => {
const standaloneCaps = seleniumstandaloneResponse.value

it('isMobile', () => {
const requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
let requestedCapabilities = {}
expect(sessionEnvironmentDetector({ capabilities: experitestAppiumCaps, requestedCapabilities }).isMobile).toBe(true)
expect(sessionEnvironmentDetector({ capabilities: appiumCaps, requestedCapabilities }).isMobile).toBe(true)
expect(sessionEnvironmentDetector({ capabilities: chromeCaps, requestedCapabilities }).isMobile).toBe(false)
})

it('isW3C', () => {
const requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
let requestedCapabilities = {}
expect(sessionEnvironmentDetector({ capabilities: appiumCaps, requestedCapabilities }).isW3C).toBe(true)
expect(sessionEnvironmentDetector({ capabilities: experitestAppiumCaps, requestedCapabilities }).isW3C).toBe(true)
expect(sessionEnvironmentDetector({ capabilities: chromeCaps, requestedCapabilities }).isW3C).toBe(true)
Expand All @@ -42,7 +42,7 @@ describe('sessionEnvironmentDetector', () => {
})

it('isChrome', () => {
const requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
let requestedCapabilities = {}
expect(sessionEnvironmentDetector({ capabilities: appiumCaps, requestedCapabilities }).isChrome).toBe(false)
expect(sessionEnvironmentDetector({ capabilities: chromeCaps, requestedCapabilities }).isChrome).toBe(true)
expect(sessionEnvironmentDetector({ capabilities: geckoCaps, requestedCapabilities }).isChrome).toBe(false)
Expand All @@ -57,26 +57,26 @@ describe('sessionEnvironmentDetector', () => {
expect(sessionEnvironmentDetector({ capabilities, requestedCapabilities }).isSauce).toBe(false)
expect(sessionEnvironmentDetector({ capabilities, hostname, requestedCapabilities }).isSauce).toBe(false)

requestedCapabilities.w3cCaps.alwaysMatch.extendedDebugging = true
requestedCapabilities.extendedDebugging = true
expect(sessionEnvironmentDetector({ capabilities, hostname, requestedCapabilities }).isSauce).toBe(true)
requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
requestedCapabilities = {}
expect(sessionEnvironmentDetector({ capabilities, hostname, requestedCapabilities }).isSauce).toBe(false)

requestedCapabilities.w3cCaps.alwaysMatch['sauce:options'] = { extendedDebugging: true }
requestedCapabilities['sauce:options'] = { extendedDebugging: true }
expect(sessionEnvironmentDetector({ capabilities, hostname, requestedCapabilities }).isSauce).toBe(true)
expect(sessionEnvironmentDetector({ capabilities, requestedCapabilities }).isSauce).toBe(true)
})

it('isSeleniumStandalone', () => {
const requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
let requestedCapabilities = {}
expect(sessionEnvironmentDetector({ capabilities: appiumCaps, requestedCapabilities }).isSeleniumStandalone).toBe(false)
expect(sessionEnvironmentDetector({ capabilities: chromeCaps, requestedCapabilities }).isSeleniumStandalone).toBe(false)
expect(sessionEnvironmentDetector({ capabilities: geckoCaps, requestedCapabilities }).isSeleniumStandalone).toBe(false)
expect(sessionEnvironmentDetector({ capabilities: standaloneCaps, requestedCapabilities }).isSeleniumStandalone).toBe(true)
})

it('should not detect mobile app for browserName===undefined', function () {
const requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
let requestedCapabilities = {}
const capabilities = {}
const { isMobile, isIOS, isAndroid } = sessionEnvironmentDetector({ capabilities, requestedCapabilities })
expect(isMobile).toEqual(false)
Expand All @@ -86,7 +86,7 @@ describe('sessionEnvironmentDetector', () => {

it('should not detect mobile app for browserName==="firefox"', function () {
const capabilities = { browserName: 'firefox' }
const requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
let requestedCapabilities = {}
const { isMobile, isIOS, isAndroid } = sessionEnvironmentDetector({ capabilities, requestedCapabilities })
expect(isMobile).toEqual(false)
expect(isIOS).toEqual(false)
Expand All @@ -95,7 +95,7 @@ describe('sessionEnvironmentDetector', () => {

it('should not detect mobile app for browserName==="chrome"', function () {
const capabilities = { browserName: 'chrome' }
const requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
let requestedCapabilities = {}
const { isMobile, isIOS, isAndroid } = sessionEnvironmentDetector({ capabilities, requestedCapabilities })
expect(isMobile).toEqual(false)
expect(isIOS).toEqual(false)
Expand All @@ -104,7 +104,7 @@ describe('sessionEnvironmentDetector', () => {

it('should detect mobile app for browserName===""', function () {
const capabilities = { browserName: '' }
const requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
let requestedCapabilities = {}
const { isMobile, isIOS, isAndroid } = sessionEnvironmentDetector({ capabilities, requestedCapabilities })
expect(isMobile).toEqual(true)
expect(isIOS).toEqual(false)
Expand All @@ -118,7 +118,7 @@ describe('sessionEnvironmentDetector', () => {
deviceName: 'LGVS450PP2a16334',
app: 'foo.apk'
}
const requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
let requestedCapabilities = {}
const { isMobile, isIOS, isAndroid } = sessionEnvironmentDetector({ capabilities, requestedCapabilities })
expect(isMobile).toEqual(true)
expect(isIOS).toEqual(false)
Expand All @@ -135,7 +135,7 @@ describe('sessionEnvironmentDetector', () => {
noReset: true,
appWaitActivity: 'com.example.gui.LauncherActivity'
}
const requestedCapabilities = { w3cCaps: { alwaysMatch: {} } }
let requestedCapabilities = {}
const { isMobile, isIOS, isAndroid } = sessionEnvironmentDetector({ capabilities, requestedCapabilities })
expect(isMobile).toEqual(true)
expect(isIOS).toEqual(false)
Expand Down
23 changes: 7 additions & 16 deletions packages/webdriver/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import logger from '@wdio/logger'
import { webdriverMonad, sessionEnvironmentDetector } from '@wdio/utils'
import { validateConfig } from '@wdio/config'

import WebDriverRequest from './request'
import { DEFAULTS } from './constants'
import { startWebDriverSession, getPrototype, getEnvironmentVars, setupDirectConnect } from './utils'

Expand Down Expand Up @@ -60,21 +59,13 @@ export default class WebDriver {
}

static async reloadSession (instance) {
const { w3cCaps, jsonwpCaps } = instance.options.requestedCapabilities
const sessionRequest = new WebDriverRequest(
'POST',
'/session',
{
capabilities: w3cCaps, // W3C compliant
desiredCapabilities: jsonwpCaps // JSONWP compliant
}
)

const response = await sessionRequest.makeRequest(instance.options)
const newSessionId = response.sessionId || (response.value && response.value.sessionId)
instance.sessionId = newSessionId

return newSessionId
const params = {
...instance.options,
capabilities: instance.requestedCapabilities
}
const sessionId = await startWebDriverSession(params)
instance.sessionId = sessionId
return sessionId
}

static get WebDriver () {
Expand Down
2 changes: 1 addition & 1 deletion packages/webdriver/src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ export async function startWebDriverSession (params) {
* save original set of capabilities to allow to request the same session again
* (e.g. for reloadSession command in WebdriverIO)
*/
params.requestedCapabilities = { w3cCaps, jsonwpCaps }
params.requestedCapabilities = params.capabilities

/**
* save actual receveived session details
Expand Down
8 changes: 8 additions & 0 deletions packages/webdriver/tests/index.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,14 @@ describe('WebDriver', () => {

expect(logger.setLevel).toBeCalled()
})

it('propagates capabilities and requestedCapabilities', async () => {
const browser = await WebDriver.newSession({
capabilities: { browserName: 'firefox' }
})
expect(browser.capabilities.browserName).toBe('mockBrowser')
expect(browser.requestedCapabilities.browserName).toBe('firefox')
})
})

describe('attachToSession', () => {
Expand Down
22 changes: 16 additions & 6 deletions packages/webdriver/tests/utils.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -230,14 +230,24 @@ describe('utils', () => {
})

describe('startWebDriverSession', () => {
it('should handle sessionRequest error', async () => {
let error
try {
await startWebDriverSession({})
} catch (err) {
error = err
it('attaches capabilities to the params object', async () => {
const params = {
hostname: 'localhost',
port: 4444,
path: '/wd/hub',
protocol: 'http',
capabilities: {
browserName: 'chrome',
}
}
const sessionId = await startWebDriverSession(params)
expect(sessionId).toBe('foobar-123')
expect(params.capabilities.browserName).toBe('mockBrowser')
expect(params.requestedCapabilities.browserName).toBe('chrome')
})

it('should handle sessionRequest error', async () => {
let error = await startWebDriverSession({}).catch((err) => err)
expect(error.message).toContain('Failed to create session')
})
})
Expand Down

0 comments on commit d8fccd7

Please sign in to comment.