From cd6192bb2698821e6b5ab962c33eee0763a406b0 Mon Sep 17 00:00:00 2001 From: Mykola Grybyk Date: Mon, 4 Feb 2019 16:52:56 +0100 Subject: [PATCH 1/2] appium reloadSession and set capabilities for next session --- packages/wdio-runner/tests/reporter.test.js | 2 +- packages/webdriver/src/index.js | 29 +------- packages/webdriver/src/utils.js | 43 ++++++++++++ packages/webdriver/tests/utils.test.js | 62 ++++++++++++++++- .../src/commands/browser/reloadSession.js | 19 ++---- .../browser/setNextSessionCapabilities.js | 38 +++++++++++ .../webdriverio/tests/__mocks__/request.js | 15 ++++- .../commands/browser/reloadSession.test.js | 67 ++++++++++++++----- .../setNextSessionCapabilities.test.js | 29 ++++++++ scripts/templates/webdriver.tpl.d.ts | 1 + 10 files changed, 247 insertions(+), 58 deletions(-) create mode 100644 packages/webdriverio/src/commands/browser/setNextSessionCapabilities.js create mode 100644 packages/webdriverio/tests/commands/browser/setNextSessionCapabilities.test.js diff --git a/packages/wdio-runner/tests/reporter.test.js b/packages/wdio-runner/tests/reporter.test.js index e9136641885..0e9e6a27d6f 100644 --- a/packages/wdio-runner/tests/reporter.test.js +++ b/packages/wdio-runner/tests/reporter.test.js @@ -159,7 +159,7 @@ describe('BaseReporter', () => { reporterSyncTimeout: 100 }) - setTimeout(() => (reporter.reporters[0].inSync = true), 110) + setTimeout(() => (reporter.reporters[0].inSync = true), 112) await expect(reporter.waitForSync()) .rejects.toEqual(new Error('Some reporters are still unsynced: CustomReporter')) }) diff --git a/packages/webdriver/src/index.js b/packages/webdriver/src/index.js index 5db98904d9c..1d907713d15 100644 --- a/packages/webdriver/src/index.js +++ b/packages/webdriver/src/index.js @@ -3,9 +3,8 @@ import merge from 'lodash.merge' import { validateConfig } from '@wdio/config' import webdriverMonad from './monad' -import WebDriverRequest from './request' import { DEFAULTS } from './constants' -import { getPrototype, environmentDetector } from './utils' +import { getPrototype, environmentDetector, buildCapabilities, buildSessionRequest } from './utils' import WebDriverProtocol from '../protocol/webdriver.json' import JsonWProtocol from '../protocol/jsonwp.json' @@ -18,30 +17,8 @@ export default class WebDriver { const params = validateConfig(DEFAULTS, options) logger.setLevel('webdriver', params.logLevel) - /** - * the user could have passed in either w3c style or jsonwp style caps - * and we want to pass both styles to the server, which means we need - * to check what style the user sent in so we know how to construct the - * object for the other style - */ - const [w3cCaps, jsonwpCaps] = params.capabilities && params.capabilities.alwaysMatch - /** - * in case W3C compliant capabilities are provided - */ - ? [params.capabilities, params.capabilities.alwaysMatch] - /** - * otherwise assume they passed in jsonwp-style caps (flat object) - */ - : [{ alwaysMatch: params.capabilities, firstMatch: [{}] }, params.capabilities] - - const sessionRequest = new WebDriverRequest( - 'POST', - '/session', - { - capabilities: w3cCaps, // W3C compliant - desiredCapabilities: jsonwpCaps // JSONWP compliant - } - ) + const { w3cCaps, jsonwpCaps } = buildCapabilities(params.capabilities) + const sessionRequest = buildSessionRequest(w3cCaps, jsonwpCaps) const response = await sessionRequest.makeRequest(params) diff --git a/packages/webdriver/src/utils.js b/packages/webdriver/src/utils.js index 157be7ac459..17b52b5fd55 100644 --- a/packages/webdriver/src/utils.js +++ b/packages/webdriver/src/utils.js @@ -8,6 +8,7 @@ import JsonWProtocol from '../protocol/jsonwp.json' import AppiumProtocol from '../protocol/appium.json' import ChromiumProtocol from '../protocol/chromium.json' import SauceLabsProtocol from '../protocol/saucelabs.json' +import WebDriverRequest from './request' const log = logger('webdriver') @@ -327,3 +328,45 @@ export class CustomRequestError extends Error { } } } + +/** + * helper method to get w3cCaps and jsonwpCaps from capabilities + * @param {object} capabilities capabilities + * @return {object} { w3cCaps, jsonwpCaps } + */ +export function buildCapabilities (capabilities) { + /** + * the user could have passed in either w3c style or jsonwp style caps + * and we want to pass both styles to the server, which means we need + * to check what style the user sent in so we know how to construct the + * object for the other style + */ + const [w3cCaps, jsonwpCaps] = capabilities && capabilities.alwaysMatch + /** + * in case W3C compliant capabilities are provided + */ + ? [capabilities, capabilities.alwaysMatch] + /** + * otherwise assume they passed in jsonwp-style caps (flat object) + */ + : [{ alwaysMatch: capabilities, firstMatch: [{}] }, capabilities] + + return { w3cCaps, jsonwpCaps } +} + +/** + * helper method to build WebDriver session request + * @param {object} w3cCaps WebDriverRequest + * @param {object} jsonwpCaps WebDriverRequest + * @return {WebDriverRequest} WebDriver session request + */ +export function buildSessionRequest (w3cCaps, jsonwpCaps) { + return new WebDriverRequest( + 'POST', + '/session', + { + capabilities: w3cCaps, // W3C compliant + desiredCapabilities: jsonwpCaps // JSONWP compliant + } + ) +} diff --git a/packages/webdriver/tests/utils.test.js b/packages/webdriver/tests/utils.test.js index 1e4eb1d8c26..5c4d09aae84 100644 --- a/packages/webdriver/tests/utils.test.js +++ b/packages/webdriver/tests/utils.test.js @@ -1,6 +1,7 @@ import { isSuccessfulResponse, isValidParameter, getArgumentType, getPrototype, commandCallStructure, - environmentDetector, getErrorFromResponseBody, isW3C, CustomRequestError + environmentDetector, getErrorFromResponseBody, isW3C, CustomRequestError, + buildCapabilities, buildSessionRequest } from '../src/utils' import appiumResponse from './__fixtures__/appium.response.json' @@ -262,4 +263,63 @@ describe('utils', () => { expect(error.name).toBe('Error') expect(error.message).toBe('unknown error') }) + + describe('buildCapabilities', () => { + const scenarios = [{ + name: 'undefined', + capabilities: undefined, + w3cCaps: { alwaysMatch: undefined, firstMatch: [{}] }, + jsonwpCaps: undefined + }, { + name: 'jsonwp', + capabilities: {}, + w3cCaps: { alwaysMatch: {}, firstMatch: [{}] }, + jsonwpCaps: {} + }, { + name: 'W3C', + capabilities: { alwaysMatch: true }, + w3cCaps: { alwaysMatch: true }, + jsonwpCaps: true + }] + + scenarios.forEach(scenario => { + it(scenario.name, () => { + const result = buildCapabilities(scenario.capabilities) + expect(result.w3cCaps).toEqual(scenario.w3cCaps) + expect(result.jsonwpCaps).toEqual(scenario.jsonwpCaps) + }) + }) + }) + + describe('buildSessionRequest', () => { + const scenarios = [{ + name: 'no w3cCaps and jsonwpCaps', + w3cCaps: undefined, + jsonwpCaps: undefined + }, { + name: 'no w3cCaps', + w3cCaps: undefined, + jsonwpCaps: { jsonwpCap: true } + }, { + name: 'no jsonwpCaps', + w3cCaps: { w3cCap: true }, + jsonwpCaps: undefined + }, { + name: 'w3cCaps and jsonwpCaps', + w3cCaps: { w3cCap: true }, + jsonwpCaps: { jsonwpCap: true } + }] + + scenarios.forEach(scenario => { + it(scenario.name, () => { + const result = buildSessionRequest(scenario.w3cCaps, scenario.jsonwpCaps) + expect(result.method).toBe('POST') + expect(result.endpoint).toBe('/session') + expect(result.body).toEqual({ + capabilities: scenario.w3cCaps, + desiredCapabilities: scenario.jsonwpCaps + }) + }) + }) + }) }) diff --git a/packages/webdriverio/src/commands/browser/reloadSession.js b/packages/webdriverio/src/commands/browser/reloadSession.js index 905b0748888..4c9cfdad8b0 100644 --- a/packages/webdriverio/src/commands/browser/reloadSession.js +++ b/packages/webdriverio/src/commands/browser/reloadSession.js @@ -8,19 +8,19 @@ * * :reloadSync.js - it('should reload my session', () => { + it('should reload my session with current capabilities', () => { console.log(browser.sessionId) // outputs: e042b3f3cd5a479da4e171825e96e655 - browser.reload() + browser.reloadSession() console.log(browser.sessionId) // outputs: 9a0d9bf9d4864160aa982c50cf18a573 }) * * - * @alias browser.reload + * @alias browser.reloadSession * @type utility * */ -import WebDriverRequest from 'webdriver/build/request' +import { buildSessionRequest } from 'webdriver/build/utils' export default async function reloadSession () { const oldSessionId = this.sessionId @@ -31,17 +31,10 @@ export default async function reloadSession () { await this.deleteSession() const { w3cCaps, jsonwpCaps } = this.options.requestedCapabilities - const sessionRequest = new WebDriverRequest( - 'POST', - '/session', - { - capabilities: w3cCaps, // W3C compliant - desiredCapabilities: jsonwpCaps // JSONWP compliant - } - ) + const sessionRequest = buildSessionRequest(w3cCaps, jsonwpCaps) const response = await sessionRequest.makeRequest(this.options) - const newSessionId = response.sessionId + const newSessionId = response.sessionId || (response.value && response.value.sessionId) this.sessionId = newSessionId if (Array.isArray(this.options.onReload) && this.options.onReload.length) { diff --git a/packages/webdriverio/src/commands/browser/setNextSessionCapabilities.js b/packages/webdriverio/src/commands/browser/setNextSessionCapabilities.js new file mode 100644 index 00000000000..a88adc84834 --- /dev/null +++ b/packages/webdriverio/src/commands/browser/setNextSessionCapabilities.js @@ -0,0 +1,38 @@ +/** + * + * Set capabilities for next session to be created by webdriverio. + * Useful if it is required to change capabilities within test and then restore them + * + * + :setNextSessionCapabilities.js + const origCapabilities = { browserName: 'firefox' } + + it('should set capabilities for next session', () => { + console.log(browser.capabilities.browserName) // outputs: firefox + browser.setNextSessionCapabilities({ browserName: 'chrome' }) + browser.reload() + console.log(browser.capabilities.browserName) // outputs: chrome + }) + + after(() => { + browser.setNextSessionCapabilities(origCapabilities) + }) + * + * + * @param {object} capabilities time in ms + * @type utility + * + */ + +import { buildCapabilities } from 'webdriver/build/utils' + +export default function setNextSessionCapabilities(capabilities) { + if (capabilities) { + let { w3cCaps, jsonwpCaps } = buildCapabilities(capabilities) + + this.options.requestedCapabilities.w3cCaps = w3cCaps + this.options.requestedCapabilities.jsonwpCaps = jsonwpCaps + } else { + throw new Error('Capabilities object is required (see https://webdriver.io/docs/api/browser/setNextSessionCapabilities.html for documentation.') + } +} diff --git a/packages/webdriverio/tests/__mocks__/request.js b/packages/webdriverio/tests/__mocks__/request.js index 04fae8d16a5..efdab573393 100644 --- a/packages/webdriverio/tests/__mocks__/request.js +++ b/packages/webdriverio/tests/__mocks__/request.js @@ -2,12 +2,14 @@ import { ELEMENT_KEY } from '../../src/constants' let manualMockResponse -const sessionId = 'foobar-123' +const defaultSessionId = 'foobar-123' +let sessionId = defaultSessionId const genericElementId = 'some-elem-123' const genericSubElementId = 'some-sub-elem-321' const genericSubSubElementId = 'some-sub-sub-elem-231' const requestMock = jest.fn().mockImplementation((params, cb) => { let value = {} + let jsonwpMode = false let sessionResponse = { sessionId, capabilities: { @@ -21,6 +23,7 @@ const requestMock = jest.fn().mockImplementation((params, cb) => { params.body.capabilities && params.body.capabilities.alwaysMatch.jsonwpMode ) { + jsonwpMode = true sessionResponse = { sessionId, browserName: 'mockBrowser' @@ -217,7 +220,7 @@ const requestMock = jest.fn().mockImplementation((params, cb) => { } let response = { value } - if (params.jsonwpMode) { + if (jsonwpMode) { response = { value, sessionId, status: 0 } } @@ -233,4 +236,12 @@ requestMock.setMockResponse = (value) => { manualMockResponse = value } +requestMock.getSessionId = () => sessionId +requestMock.setSessionId = (newSessionId) => { + sessionId = newSessionId +} +requestMock.resetSessionId = () => { + sessionId = defaultSessionId +} + export default requestMock diff --git a/packages/webdriverio/tests/commands/browser/reloadSession.test.js b/packages/webdriverio/tests/commands/browser/reloadSession.test.js index 966da50df67..11f0d2da555 100644 --- a/packages/webdriverio/tests/commands/browser/reloadSession.test.js +++ b/packages/webdriverio/tests/commands/browser/reloadSession.test.js @@ -2,22 +2,59 @@ import request from 'request' import { remote } from '../../../src' describe('reloadSession test', () => { - it('should allow to check if an element is enabled', async () => { - const hook = jest.fn() - const browser = await remote({ - baseUrl: 'http://foobar.com', - capabilities: { - browserName: 'foobar' - }, - onReload: [hook] - }) + const scenarios = [{ + name: 'should be undefined if sessionId is missing in response', + sessionIdMock: 'ignored if jsonwpMode is false', + requestMock: [{}, {}], + newSessionId: undefined, + jsonwpMode: false + }, { + name: 'should be ok if sessionId is in response', + sessionIdMock: 'foobar-234', + requestMock: [{}, {}], + newSessionId: 'foobar-234', + jsonwpMode: true + }, { + name: 'should be ok if sessionId is in response.value', + sessionIdMock: undefined, + requestMock: [{}, { sessionId: 'foobar-345' }], + newSessionId: 'foobar-345', + }, { + name: 'should be sessionId if sessionId and value.sessionId are present', + sessionIdMock: 'foobar-456', + requestMock: [{}, { sessionId: 'foobar-567' }], + newSessionId: 'foobar-456', + jsonwpMode: true + }] + + scenarios.forEach(scenario => { + it(scenario.name, async () => { + const oldSessionId = request.getSessionId() + const hook = jest.fn() + const browser = await remote({ + baseUrl: 'http://foobar.com', + capabilities: { + jsonwpMode: scenario.jsonwpMode, + browserName: 'foobar' + }, + onReload: [hook] + }) + + request.setSessionId(scenario.sessionIdMock) + request.setMockResponse(scenario.requestMock) + await browser.reloadSession() - await browser.reloadSession() + expect(request.mock.calls[1][0].method).toBe('DELETE') + expect(request.mock.calls[1][0].uri.pathname).toBe(`/wd/hub/session/${oldSessionId}`) + expect(request.mock.calls[2][0].method).toBe('POST') + expect(request.mock.calls[2][0].uri.pathname).toBe('/wd/hub/session') + expect(hook).toBeCalledWith(oldSessionId, scenario.newSessionId) + }) + }) - expect(request.mock.calls[1][0].method).toBe('DELETE') - expect(request.mock.calls[1][0].uri.pathname).toBe('/wd/hub/session/foobar-123') - expect(request.mock.calls[2][0].method).toBe('POST') - expect(request.mock.calls[2][0].uri.pathname).toBe('/wd/hub/session') - expect(hook).toBeCalledWith('foobar-123', undefined) + afterEach(() => { + request.mockClear() + request.resetSessionId() + request.setMockResponse() }) }) diff --git a/packages/webdriverio/tests/commands/browser/setNextSessionCapabilities.test.js b/packages/webdriverio/tests/commands/browser/setNextSessionCapabilities.test.js new file mode 100644 index 00000000000..24a8aaa9cad --- /dev/null +++ b/packages/webdriverio/tests/commands/browser/setNextSessionCapabilities.test.js @@ -0,0 +1,29 @@ +import request from 'request' +import { remote } from '../../../src' + +describe('setNextSessionCapabilities test', () => { + let browser + beforeEach(async () => { + browser = await remote({ + baseUrl: 'http://foobar.com', + capabilities: { + browserName: 'foo' + }, + onReload: true + }) + }) + it('should be possible to pass capabilities object', async () => { + browser.setNextSessionCapabilities({ browserName: 'bar' }) + await browser.reloadSession() + + expect(request.mock.calls[2][0].body.capabilities.alwaysMatch.browserName).toBe('bar') + }) + + it('should throw error if no capabilities passed', () => { + expect(() => browser.setNextSessionCapabilities()).toThrowError(/Capabilities object is required/) + }) + + afterEach(() => { + request.mockClear() + }) +}) diff --git a/scripts/templates/webdriver.tpl.d.ts b/scripts/templates/webdriver.tpl.d.ts index a5697cadf10..60c5f37d651 100644 --- a/scripts/templates/webdriver.tpl.d.ts +++ b/scripts/templates/webdriver.tpl.d.ts @@ -239,6 +239,7 @@ declare namespace WebDriver { isAndroid: boolean; isMobile: boolean; isIOS: boolean; + sessionId: string; } // generated typings From 9a3251952ddbbefcaaebba434906df3f60fd2d0c Mon Sep 17 00:00:00 2001 From: Mykola Grybyk Date: Tue, 5 Feb 2019 11:46:17 +0100 Subject: [PATCH 2/2] webdriver: fix appium reloadSession --- packages/webdriver/src/index.js | 29 ++++++++- packages/webdriver/src/utils.js | 43 ------------- packages/webdriver/tests/utils.test.js | 62 +------------------ .../src/commands/browser/reloadSession.js | 11 +++- .../browser/setNextSessionCapabilities.js | 38 ------------ .../setNextSessionCapabilities.test.js | 29 --------- 6 files changed, 36 insertions(+), 176 deletions(-) delete mode 100644 packages/webdriverio/src/commands/browser/setNextSessionCapabilities.js delete mode 100644 packages/webdriverio/tests/commands/browser/setNextSessionCapabilities.test.js diff --git a/packages/webdriver/src/index.js b/packages/webdriver/src/index.js index 1d907713d15..5db98904d9c 100644 --- a/packages/webdriver/src/index.js +++ b/packages/webdriver/src/index.js @@ -3,8 +3,9 @@ import merge from 'lodash.merge' import { validateConfig } from '@wdio/config' import webdriverMonad from './monad' +import WebDriverRequest from './request' import { DEFAULTS } from './constants' -import { getPrototype, environmentDetector, buildCapabilities, buildSessionRequest } from './utils' +import { getPrototype, environmentDetector } from './utils' import WebDriverProtocol from '../protocol/webdriver.json' import JsonWProtocol from '../protocol/jsonwp.json' @@ -17,8 +18,30 @@ export default class WebDriver { const params = validateConfig(DEFAULTS, options) logger.setLevel('webdriver', params.logLevel) - const { w3cCaps, jsonwpCaps } = buildCapabilities(params.capabilities) - const sessionRequest = buildSessionRequest(w3cCaps, jsonwpCaps) + /** + * the user could have passed in either w3c style or jsonwp style caps + * and we want to pass both styles to the server, which means we need + * to check what style the user sent in so we know how to construct the + * object for the other style + */ + const [w3cCaps, jsonwpCaps] = params.capabilities && params.capabilities.alwaysMatch + /** + * in case W3C compliant capabilities are provided + */ + ? [params.capabilities, params.capabilities.alwaysMatch] + /** + * otherwise assume they passed in jsonwp-style caps (flat object) + */ + : [{ alwaysMatch: params.capabilities, firstMatch: [{}] }, params.capabilities] + + const sessionRequest = new WebDriverRequest( + 'POST', + '/session', + { + capabilities: w3cCaps, // W3C compliant + desiredCapabilities: jsonwpCaps // JSONWP compliant + } + ) const response = await sessionRequest.makeRequest(params) diff --git a/packages/webdriver/src/utils.js b/packages/webdriver/src/utils.js index 17b52b5fd55..157be7ac459 100644 --- a/packages/webdriver/src/utils.js +++ b/packages/webdriver/src/utils.js @@ -8,7 +8,6 @@ import JsonWProtocol from '../protocol/jsonwp.json' import AppiumProtocol from '../protocol/appium.json' import ChromiumProtocol from '../protocol/chromium.json' import SauceLabsProtocol from '../protocol/saucelabs.json' -import WebDriverRequest from './request' const log = logger('webdriver') @@ -328,45 +327,3 @@ export class CustomRequestError extends Error { } } } - -/** - * helper method to get w3cCaps and jsonwpCaps from capabilities - * @param {object} capabilities capabilities - * @return {object} { w3cCaps, jsonwpCaps } - */ -export function buildCapabilities (capabilities) { - /** - * the user could have passed in either w3c style or jsonwp style caps - * and we want to pass both styles to the server, which means we need - * to check what style the user sent in so we know how to construct the - * object for the other style - */ - const [w3cCaps, jsonwpCaps] = capabilities && capabilities.alwaysMatch - /** - * in case W3C compliant capabilities are provided - */ - ? [capabilities, capabilities.alwaysMatch] - /** - * otherwise assume they passed in jsonwp-style caps (flat object) - */ - : [{ alwaysMatch: capabilities, firstMatch: [{}] }, capabilities] - - return { w3cCaps, jsonwpCaps } -} - -/** - * helper method to build WebDriver session request - * @param {object} w3cCaps WebDriverRequest - * @param {object} jsonwpCaps WebDriverRequest - * @return {WebDriverRequest} WebDriver session request - */ -export function buildSessionRequest (w3cCaps, jsonwpCaps) { - return new WebDriverRequest( - 'POST', - '/session', - { - capabilities: w3cCaps, // W3C compliant - desiredCapabilities: jsonwpCaps // JSONWP compliant - } - ) -} diff --git a/packages/webdriver/tests/utils.test.js b/packages/webdriver/tests/utils.test.js index 5c4d09aae84..1e4eb1d8c26 100644 --- a/packages/webdriver/tests/utils.test.js +++ b/packages/webdriver/tests/utils.test.js @@ -1,7 +1,6 @@ import { isSuccessfulResponse, isValidParameter, getArgumentType, getPrototype, commandCallStructure, - environmentDetector, getErrorFromResponseBody, isW3C, CustomRequestError, - buildCapabilities, buildSessionRequest + environmentDetector, getErrorFromResponseBody, isW3C, CustomRequestError } from '../src/utils' import appiumResponse from './__fixtures__/appium.response.json' @@ -263,63 +262,4 @@ describe('utils', () => { expect(error.name).toBe('Error') expect(error.message).toBe('unknown error') }) - - describe('buildCapabilities', () => { - const scenarios = [{ - name: 'undefined', - capabilities: undefined, - w3cCaps: { alwaysMatch: undefined, firstMatch: [{}] }, - jsonwpCaps: undefined - }, { - name: 'jsonwp', - capabilities: {}, - w3cCaps: { alwaysMatch: {}, firstMatch: [{}] }, - jsonwpCaps: {} - }, { - name: 'W3C', - capabilities: { alwaysMatch: true }, - w3cCaps: { alwaysMatch: true }, - jsonwpCaps: true - }] - - scenarios.forEach(scenario => { - it(scenario.name, () => { - const result = buildCapabilities(scenario.capabilities) - expect(result.w3cCaps).toEqual(scenario.w3cCaps) - expect(result.jsonwpCaps).toEqual(scenario.jsonwpCaps) - }) - }) - }) - - describe('buildSessionRequest', () => { - const scenarios = [{ - name: 'no w3cCaps and jsonwpCaps', - w3cCaps: undefined, - jsonwpCaps: undefined - }, { - name: 'no w3cCaps', - w3cCaps: undefined, - jsonwpCaps: { jsonwpCap: true } - }, { - name: 'no jsonwpCaps', - w3cCaps: { w3cCap: true }, - jsonwpCaps: undefined - }, { - name: 'w3cCaps and jsonwpCaps', - w3cCaps: { w3cCap: true }, - jsonwpCaps: { jsonwpCap: true } - }] - - scenarios.forEach(scenario => { - it(scenario.name, () => { - const result = buildSessionRequest(scenario.w3cCaps, scenario.jsonwpCaps) - expect(result.method).toBe('POST') - expect(result.endpoint).toBe('/session') - expect(result.body).toEqual({ - capabilities: scenario.w3cCaps, - desiredCapabilities: scenario.jsonwpCaps - }) - }) - }) - }) }) diff --git a/packages/webdriverio/src/commands/browser/reloadSession.js b/packages/webdriverio/src/commands/browser/reloadSession.js index 4c9cfdad8b0..b1895a67797 100644 --- a/packages/webdriverio/src/commands/browser/reloadSession.js +++ b/packages/webdriverio/src/commands/browser/reloadSession.js @@ -20,7 +20,7 @@ * */ -import { buildSessionRequest } from 'webdriver/build/utils' +import WebDriverRequest from 'webdriver/build/request' export default async function reloadSession () { const oldSessionId = this.sessionId @@ -31,7 +31,14 @@ export default async function reloadSession () { await this.deleteSession() const { w3cCaps, jsonwpCaps } = this.options.requestedCapabilities - const sessionRequest = buildSessionRequest(w3cCaps, jsonwpCaps) + const sessionRequest = new WebDriverRequest( + 'POST', + '/session', + { + capabilities: w3cCaps, // W3C compliant + desiredCapabilities: jsonwpCaps // JSONWP compliant + } + ) const response = await sessionRequest.makeRequest(this.options) const newSessionId = response.sessionId || (response.value && response.value.sessionId) diff --git a/packages/webdriverio/src/commands/browser/setNextSessionCapabilities.js b/packages/webdriverio/src/commands/browser/setNextSessionCapabilities.js deleted file mode 100644 index a88adc84834..00000000000 --- a/packages/webdriverio/src/commands/browser/setNextSessionCapabilities.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * - * Set capabilities for next session to be created by webdriverio. - * Useful if it is required to change capabilities within test and then restore them - * - * - :setNextSessionCapabilities.js - const origCapabilities = { browserName: 'firefox' } - - it('should set capabilities for next session', () => { - console.log(browser.capabilities.browserName) // outputs: firefox - browser.setNextSessionCapabilities({ browserName: 'chrome' }) - browser.reload() - console.log(browser.capabilities.browserName) // outputs: chrome - }) - - after(() => { - browser.setNextSessionCapabilities(origCapabilities) - }) - * - * - * @param {object} capabilities time in ms - * @type utility - * - */ - -import { buildCapabilities } from 'webdriver/build/utils' - -export default function setNextSessionCapabilities(capabilities) { - if (capabilities) { - let { w3cCaps, jsonwpCaps } = buildCapabilities(capabilities) - - this.options.requestedCapabilities.w3cCaps = w3cCaps - this.options.requestedCapabilities.jsonwpCaps = jsonwpCaps - } else { - throw new Error('Capabilities object is required (see https://webdriver.io/docs/api/browser/setNextSessionCapabilities.html for documentation.') - } -} diff --git a/packages/webdriverio/tests/commands/browser/setNextSessionCapabilities.test.js b/packages/webdriverio/tests/commands/browser/setNextSessionCapabilities.test.js deleted file mode 100644 index 24a8aaa9cad..00000000000 --- a/packages/webdriverio/tests/commands/browser/setNextSessionCapabilities.test.js +++ /dev/null @@ -1,29 +0,0 @@ -import request from 'request' -import { remote } from '../../../src' - -describe('setNextSessionCapabilities test', () => { - let browser - beforeEach(async () => { - browser = await remote({ - baseUrl: 'http://foobar.com', - capabilities: { - browserName: 'foo' - }, - onReload: true - }) - }) - it('should be possible to pass capabilities object', async () => { - browser.setNextSessionCapabilities({ browserName: 'bar' }) - await browser.reloadSession() - - expect(request.mock.calls[2][0].body.capabilities.alwaysMatch.browserName).toBe('bar') - }) - - it('should throw error if no capabilities passed', () => { - expect(() => browser.setNextSessionCapabilities()).toThrowError(/Capabilities object is required/) - }) - - afterEach(() => { - request.mockClear() - }) -})