Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Removing Redundant Calls for PoA #1413

Merged
merged 3 commits into from
Oct 31, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 12 additions & 14 deletions packages/webdriver-utils/src/driver.js
Original file line number Diff line number Diff line change
@@ -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 {
@@ -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;
@@ -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;
1 change: 1 addition & 0 deletions packages/webdriver-utils/src/index.js
Original file line number Diff line number Diff line change
@@ -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}`);
2 changes: 1 addition & 1 deletion packages/webdriver-utils/src/metadata/desktopMetaData.js
Original file line number Diff line number Diff line change
@@ -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]}`;
});
4 changes: 0 additions & 4 deletions packages/webdriver-utils/src/providers/automateProvider.js
Original file line number Diff line number Diff line change
@@ -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
Amit3200 marked this conversation as resolved.
Show resolved Hide resolved
[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,
21 changes: 1 addition & 20 deletions packages/webdriver-utils/src/providers/genericProvider.js
Original file line number Diff line number Diff line change
@@ -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 {
@@ -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(),
@@ -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
@@ -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
@@ -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: [] });
});
});

Original file line number Diff line number Diff line change
@@ -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')
@@ -244,7 +243,6 @@ describe('AutomateProvider', () => {
let windowSizeSpy;
let orientationSpy;
let resolutionSpy;
let getHeaderFooterSpy;
let percyBuildInfo = {
id: '123',
url: 'https://percy.io/abc/123'
@@ -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')
@@ -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',
@@ -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')
@@ -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',
Original file line number Diff line number Diff line change
@@ -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;
@@ -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));
});

@@ -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 () => {
@@ -103,7 +99,7 @@ describe('GenericProvider', () => {
osName: 'android',
osVersion: 'mockOsVersion',
width: 1000,
height: 1000 + 123 + 456,
height: 1000,
orientation: 'landscape',
browserName: 'mockBrowserName',
browserVersion: '111',
@@ -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);
});
});
});