Skip to content

Commit

Permalink
Removing Redundant Calls for PoA (#1413)
Browse files Browse the repository at this point in the history
* Removing Redundant Calls for PoA

* Removing call from genericProvider

* Fixing lint
  • Loading branch information
Amit3200 authored Oct 31, 2023
1 parent e560f5d commit facf9e1
Show file tree
Hide file tree
Showing 9 changed files with 31 additions and 114 deletions.
26 changes: 12 additions & 14 deletions packages/webdriver-utils/src/driver.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@ export default class Driver {
this.passedCapabilities = passedCapabilities;
}

static requestPostOptions(command) {
return {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify(command)
};
}

async getCapabilites() {
return await Cache.withCache(Cache.caps, this.sessionId, async () => {
try {
Expand Down Expand Up @@ -43,13 +53,7 @@ export default class Driver {
if (!command.script.includes('browserstack_executor')) {
command.script = `/* percy_automate_script */ \n ${command.script}`;
}
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify(command)
};
const options = Driver.requestPostOptions(command);
const baseUrl = `${this.executorUrl}/session/${this.sessionId}/execute/sync`;
const response = JSON.parse((await request(baseUrl, options)).body);
return response;
Expand All @@ -68,13 +72,7 @@ export default class Driver {
}

async findElement(using, value) {
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify({ using, value })
};
const options = Driver.requestPostOptions({ using, value });
const baseUrl = `${this.executorUrl}/session/${this.sessionId}/element`;
const response = JSON.parse((await request(baseUrl, options)).body);
return response.value;
Expand Down
1 change: 1 addition & 0 deletions packages/webdriver-utils/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export default class WebdriverUtils {
const comparisonData = await automate.screenshot(snapshotName, options);
comparisonData.metadata.cliScreenshotStartTime = startTime;
comparisonData.metadata.cliScreenshotEndTime = Date.now();
log.debug(`[${snapshotName}] : Comparison Data: ${JSON.stringify(comparisonData)}`);
return comparisonData;
} catch (e) {
log.error(`[${snapshotName}] : Error - ${e.message}`);
Expand Down
2 changes: 1 addition & 1 deletion packages/webdriver-utils/src/metadata/desktopMetaData.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export default class DesktopMetaData {

async screenResolution() {
return await Cache.withCache(Cache.resolution, this.driver.sessionId, async () => {
const data = await this.driver.executeScript({ script: 'return [(window.screen.width * window.devicePixelRatio).toString(), (window.screen.height * window.devicePixelRatio).toString()];', args: [] });
const data = await this.driver.executeScript({ script: 'return [parseInt(window.screen.width * window.devicePixelRatio).toString(), parseInt(window.screen.height * window.devicePixelRatio).toString()];', args: [] });
const screenInfo = data.value;
return `${screenInfo[0]} x ${screenInfo[1]}`;
});
Expand Down
4 changes: 0 additions & 4 deletions packages/webdriver-utils/src/providers/automateProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -187,10 +187,6 @@ export default class AutomateProvider extends GenericProvider {
const resolution = await this.metaData.screenResolution();
const orientation = (this.metaData.orientation() || automateCaps.deviceOrientation)?.toLowerCase();

// for android window size only constitutes of browser viewport, hence adding nav / status / url bar heights
[this.header, this.footer] = await this.getHeaderFooter(deviceName, osVersion, browserName);
height = this.metaData.device() && osName?.toLowerCase() === 'android' ? height + this.header + this.footer : height;

return {
name: deviceName,
osName,
Expand Down
21 changes: 1 addition & 20 deletions packages/webdriver-utils/src/providers/genericProvider.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@ import utils from '@percy/sdk-utils';
import MetaDataResolver from '../metadata/metaDataResolver.js';
import Tile from '../util/tile.js';
import Driver from '../driver.js';
import Cache from '../util/cache.js';
const { request } = utils;

const DEVICES_CONFIG_URL = 'https://storage.googleapis.com/percy-utils/devices.json';
const log = utils.logger('webdriver-utils:genericProvider');

export default class GenericProvider {
Expand Down Expand Up @@ -156,9 +153,7 @@ export default class GenericProvider {
let { width, height } = await this.metaData.windowSize();
const resolution = await this.metaData.screenResolution();
const orientation = this.metaData.orientation();
[this.header, this.footer] = await this.getHeaderFooter();
// for android window size only constitutes of browser viewport, hence adding nav / status / url bar heights
height = this.metaData.osName() === 'android' ? height + this.header + this.footer : height;

return {
name: this.metaData.deviceName(),
osName: this.metaData.osName(),
Expand Down Expand Up @@ -268,18 +263,4 @@ export default class GenericProvider {
}
return elementsArray;
}

async getHeaderFooter(deviceName, osVersion, browserName) {
// passing 0 as key, since across different pages and tests, this config will remain same
const devicesConfig = await Cache.withCache(Cache.devicesConfig, 0, async () => {
return (await request(DEVICES_CONFIG_URL)).body;
});
let deviceKey = `${deviceName}-${osVersion}`;
return devicesConfig[deviceKey]
? (
devicesConfig[deviceKey][browserName]
? [devicesConfig[deviceKey][browserName].header, devicesConfig[deviceKey][browserName].footer]
: [0, 0]
) : [0, 0];
}
}
14 changes: 14 additions & 0 deletions packages/webdriver-utils/test/driver.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -161,4 +161,18 @@ describe('Driver', () => {
expect(res).toEqual('mockVal');
});
});

describe('requestPostOptions', () => {
const command = { simple: 'test' };
const expectedResponse = {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify(command)
};
it('returns post options', () => {
expect(Driver.requestPostOptions(command)).toEqual(expectedResponse);
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ describe('DesktopMetaData', () => {
screenInfo = await desktopMetaData.screenResolution();
expect(screenInfo).toEqual('1980 x 1080');
expect(executeScriptSpy)
.toHaveBeenCalledWith({ script: 'return [(window.screen.width * window.devicePixelRatio).toString(), (window.screen.height * window.devicePixelRatio).toString()];', args: [] });
.toHaveBeenCalledWith({ script: 'return [parseInt(window.screen.width * window.devicePixelRatio).toString(), parseInt(window.screen.height * window.devicePixelRatio).toString()];', args: [] });
});
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,6 @@ describe('AutomateProvider', () => {

beforeEach(async () => {
spyOn(Driver.prototype, 'getCapabilites');
spyOn(GenericProvider.prototype, 'getHeaderFooter').and.returnValue(Promise.resolve([123, 456]));
browserstackExecutorSpy = spyOn(AutomateProvider.prototype, 'browserstackExecutor')
.and.returnValue(Promise.resolve({ value: '{ "result": "{\\"dom_sha\\": \\"abc\\", \\"sha\\": [\\"abc-1\\", \\"xyz-2\\"]}", "success":true }' }));
executeScriptSpy = spyOn(Driver.prototype, 'executeScript')
Expand Down Expand Up @@ -244,7 +243,6 @@ describe('AutomateProvider', () => {
let windowSizeSpy;
let orientationSpy;
let resolutionSpy;
let getHeaderFooterSpy;
let percyBuildInfo = {
id: '123',
url: 'https://percy.io/abc/123'
Expand All @@ -256,7 +254,6 @@ describe('AutomateProvider', () => {
percyScreenshotBeginSpy = spyOn(AutomateProvider.prototype,
'percyScreenshotBegin').and.returnValue({ value: '{"buildHash":"12e3","sessionHash":"abc1d","capabilities":{"browserName":"chrome","browserVersion":"113.0","os":"win11","os_version":"11","deviceOrientation":false,"resolution":["1920","1080"]},"success":true,"deviceName":"x.x.x.x"}' });
spyOn(Driver.prototype, 'getCapabilites');
getHeaderFooterSpy = spyOn(GenericProvider.prototype, 'getHeaderFooter').and.returnValue(Promise.resolve([0, 0]));
windowSizeSpy = spyOn(DesktopMetaData.prototype, 'windowSize')
.and.returnValue(Promise.resolve({ width: 1000, height: 1000 }));
resolutionSpy = spyOn(DesktopMetaData.prototype, 'screenResolution')
Expand All @@ -275,7 +272,6 @@ describe('AutomateProvider', () => {
expect(windowSizeSpy).toHaveBeenCalledTimes(1);
expect(resolutionSpy).toHaveBeenCalledTimes(1);
expect(orientationSpy).toHaveBeenCalledTimes(1);
expect(getHeaderFooterSpy).toHaveBeenCalledTimes(1);
expect(res).toEqual({
name: 'Windows_11_chrome_113',
osName: 'Windows',
Expand All @@ -296,7 +292,6 @@ describe('AutomateProvider', () => {
percyScreenshotBeginSpy = spyOn(AutomateProvider.prototype,
'percyScreenshotBegin').and.returnValue({ value: '{"buildHash":"12e3","sessionHash":"abc1d","capabilities":{"browserName":"chrome_android","browserVersion":"chrome_android","os":"android","os_version":"11","deviceOrientation":"portrait","resolution":["1920","1080"]},"success":true,"deviceName":"Samsung Galaxy S21"}' });
spyOn(Driver.prototype, 'getCapabilites');
getHeaderFooterSpy = spyOn(GenericProvider.prototype, 'getHeaderFooter').and.returnValue(Promise.resolve([0, 0]));
windowSizeSpy = spyOn(MobileMetaData.prototype, 'windowSize')
.and.returnValue(Promise.resolve({ width: 1000, height: 1000 }));
resolutionSpy = spyOn(MobileMetaData.prototype, 'screenResolution')
Expand All @@ -315,7 +310,6 @@ describe('AutomateProvider', () => {
expect(windowSizeSpy).toHaveBeenCalledTimes(1);
expect(resolutionSpy).toHaveBeenCalledTimes(1);
expect(orientationSpy).toHaveBeenCalledTimes(1);
expect(getHeaderFooterSpy).toHaveBeenCalledTimes(1);
expect(res).toEqual({
name: 'Samsung Galaxy S21',
osName: 'Android',
Expand Down
69 changes: 1 addition & 68 deletions packages/webdriver-utils/test/providers/genericProvider.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ import GenericProvider from '../../src/providers/genericProvider.js';
import Driver from '../../src/driver.js';
import MetaDataResolver from '../../src/metadata/metaDataResolver.js';
import DesktopMetaData from '../../src/metadata/desktopMetaData.js';
import Cache from '../../src/util/cache.js';
import MobileMetaData from '../../src/metadata/mobileMetaData.js';
import utils from '@percy/sdk-utils';

describe('GenericProvider', () => {
let genericProvider;
Expand Down Expand Up @@ -36,7 +34,6 @@ describe('GenericProvider', () => {
describe('getTiles', () => {
beforeEach(() => {
spyOn(Driver.prototype, 'takeScreenshot').and.returnValue(Promise.resolve('123b='));
spyOn(GenericProvider.prototype, 'getHeaderFooter').and.returnValue(Promise.resolve([123, 456]));
spyOn(GenericProvider.prototype, 'getWindowHeight').and.returnValue(Promise.resolve(1947));
});

Expand Down Expand Up @@ -90,7 +87,6 @@ describe('GenericProvider', () => {
.and.returnValue('111');
spyOn(MobileMetaData.prototype, 'screenResolution')
.and.returnValue('1980 x 1080');
spyOn(GenericProvider.prototype, 'getHeaderFooter').and.returnValue(Promise.resolve([123, 456]));
});

it('returns correct tag for android', async () => {
Expand All @@ -103,7 +99,7 @@ describe('GenericProvider', () => {
osName: 'android',
osVersion: 'mockOsVersion',
width: 1000,
height: 1000 + 123 + 456,
height: 1000,
orientation: 'landscape',
browserName: 'mockBrowserName',
browserVersion: '111',
Expand Down Expand Up @@ -346,67 +342,4 @@ describe('GenericProvider', () => {
expect(elementsArray).toEqual([]);
});
});

describe('getHeaderFooter', () => {
let provider;

beforeEach(async () => {
provider = new GenericProvider('123', 'http:executorUrl', { browserName: 'safari', deviceName: 'iPhone 12 Pro', platform: 'iOS' }, {});
spyOn(MobileMetaData.prototype, 'deviceName').and.returnValue('iPhone 12 Pro');
spyOn(MobileMetaData.prototype, 'osVersion').and.returnValue('13');
});

it('should return the matching header and footer', async () => {
await provider.createDriver();
let mockResponseObject = {
body: {
'iPhone 12 Pro-13': {
safari: {
header: 141,
footer: 399
}
}
},
status: 200,
headers: { 'content-type': 'application/json' }
};
spyOn(utils.request, 'fetch').and.returnValue(
Promise.resolve(mockResponseObject)
);
const [header, footer] = await provider.getHeaderFooter('iPhone 12 Pro', '13', 'safari');
expect(header).toEqual(141);
expect(footer).toEqual(399);
});

it('should return 0,0 for unmatched device name', async () => {
await provider.createDriver();
let mockResponseObject = {
'iPhone 13 Pro-14': {}
};
spyOn(Cache, 'withCache').and.returnValue(
Promise.resolve(mockResponseObject)
);
const [header, footer] = await provider.getHeaderFooter('iPhone 13 Pro', '14', 'safari');
expect(header).toEqual(0);
expect(footer).toEqual(0);
});

it('should return 0,0 for unmatched browser name', async () => {
await provider.createDriver();
let mockResponseObject = {
'iPhone 12 Pro-13': {
chrome: {
header: 141,
footer: 399
}
}
};
spyOn(Cache, 'withCache').and.returnValue(
Promise.resolve(mockResponseObject)
);
const [header, footer] = await provider.getHeaderFooter();
expect(header).toEqual(0);
expect(footer).toEqual(0);
});
});
});

0 comments on commit facf9e1

Please sign in to comment.