@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
118 lines • 16 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/* global Symbol */
const lodash_1 = require("lodash");
const promisify_event_1 = __importDefault(require("promisify-event"));
const browser_job_result_1 = __importDefault(require("../../runner/browser-job-result"));
const connection_1 = __importDefault(require("../connection"));
const warning_message_1 = __importDefault(require("../../notifications/warning-message"));
const testcafe_hammerhead_1 = require("testcafe-hammerhead");
const name = Symbol();
class BrowserProviderPluginHost {
constructor(providerObject, providerName) {
this.JOB_RESULT = lodash_1.assignIn({}, browser_job_result_1.default);
lodash_1.assignIn(this, providerObject);
this[name] = providerName;
}
// Helpers
get providerName() {
return this[name];
}
async runInitScript(browserId, code) {
const connection = connection_1.default.getById(browserId);
return connection.runInitScript(`(${code})()`);
}
calculateWindowId() {
return testcafe_hammerhead_1.generateUniqueId();
}
waitForConnectionReady(browserId) {
const connection = connection_1.default.getById(browserId);
if (connection.isReady())
return Promise.resolve();
return promisify_event_1.default(connection, 'ready');
}
reportWarning(browserId, ...args) {
const connection = connection_1.default.getById(browserId);
connection.addWarning(...args);
}
setUserAgentMetaInfo(browserId, message) {
const connection = connection_1.default.getById(browserId);
connection.setProviderMetaInfo(message);
}
async closeLocalBrowser(browserId) {
const connection = connection_1.default.getById(browserId);
await connection.provider._ensureBrowserWindowDescriptor(browserId);
await connection.provider._closeLocalBrowser(browserId);
}
async resizeLocalBrowserWindow(browserId, width, height, currentWidth, currentHeight) {
const connection = connection_1.default.getById(browserId);
await connection.provider._ensureBrowserWindowParameters(browserId);
await connection.provider._resizeLocalBrowserWindow(browserId, width, height, currentWidth, currentHeight);
}
// API
// Browser control
async openBrowser( /* browserId, pageUrl, browserName */) {
throw new Error('Not implemented!');
}
async closeBrowser( /* browserId */) {
throw new Error('Not implemented!');
}
// Initialization
async init() {
return;
}
async dispose() {
return;
}
// Browser names handling
async getBrowserList() {
throw new Error('Not implemented!');
}
async isValidBrowserName( /* browserName */) {
return true;
}
// Extra functions
// NOTE: The browserName argument is optional, and must be supplied if the browserId argument is not valid (browser is not opened)
async isLocalBrowser( /* browserId[, browserName] */) {
return false;
}
isHeadlessBrowser( /* browserId */) {
return false;
}
async hasCustomActionForBrowser( /* browserId */) {
return {
hasCloseBrowser: this.hasOwnProperty('closeBrowser'),
hasResizeWindow: this.hasOwnProperty('resizeWindow'),
hasTakeScreenshot: this.hasOwnProperty('takeScreenshot'),
hasGetVideoFrameData: this.hasOwnProperty('getVideoFrameData'),
hasCanResizeWindowToDimensions: this.hasOwnProperty('canResizeWindowToDimensions'),
hasMaximizeWindow: this.hasOwnProperty('maximizeWindow'),
hasChromelessScreenshots: false
};
}
async resizeWindow(browserId /*, width, height, currentWidth, currentHeight */) {
this.reportWarning(browserId, warning_message_1.default.resizeNotSupportedByBrowserProvider, this[name]);
}
async canResizeWindowToDimensions( /* browserId, width, height */) {
return true;
}
async takeScreenshot(browserId /*, screenshotPath, pageWidth, pageHeight */) {
this.reportWarning(browserId, warning_message_1.default.screenshotNotSupportedByBrowserProvider, this[name]);
}
async maximizeWindow(browserId) {
this.reportWarning(browserId, warning_message_1.default.maximizeNotSupportedByBrowserProvider, this[name]);
}
async getVideoFrameData(browserId) {
const browserAlias = connection_1.default.getById(browserId).browserInfo.alias;
this.reportWarning(browserId, warning_message_1.default.videoNotSupportedByBrowser, browserAlias);
}
async reportJobResult( /*browserId, status, data*/) {
return;
}
}
exports.default = BrowserProviderPluginHost;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYnJvd3Nlci9wcm92aWRlci9wbHVnaW4taG9zdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1CQUFtQjtBQUNuQixtQ0FBa0M7QUFDbEMsc0VBQTZDO0FBQzdDLHlGQUFpRTtBQUNqRSwrREFBOEM7QUFDOUMsMEZBQWtFO0FBQ2xFLDZEQUF1RDtBQUV2RCxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUV0QixNQUFxQix5QkFBeUI7SUFDMUMsWUFBYSxjQUFjLEVBQUUsWUFBWTtRQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLGlCQUFRLENBQUMsRUFBRSxFQUFFLDRCQUFrQixDQUFDLENBQUM7UUFFbkQsaUJBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQztJQUM5QixDQUFDO0lBR0QsVUFBVTtJQUNWLElBQUksWUFBWTtRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUFFLFNBQVMsRUFBRSxJQUFJO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLG9CQUFpQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUV4RCxPQUFPLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxpQkFBaUI7UUFDYixPQUFPLHNDQUFnQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELHNCQUFzQixDQUFFLFNBQVM7UUFDN0IsTUFBTSxVQUFVLEdBQUcsb0JBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRXhELElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRTtZQUNwQixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FB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RUFBUSxLQUFLO1NBQ3hDLENBQUM7SUFDTixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVksQ0FBRSxTQUFTLENBQUEsaURBQWlEO1FBQzFFLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLHlCQUFlLENBQUMsbUNBQW1DLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVELEtBQUssQ0FBQywyQkFBMkIsRUFBRSw4QkFBOEI7UUFDN0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQUUsU0FBUyxDQUFBLDRDQUE0QztRQUN2RSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSx5QkFBZSxDQUFDLHVDQUF1QyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYyxDQUFFLFNBQVM7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUseUJBQWUsQ0FBQyxxQ0FBcUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFFLFNBQVM7UUFDOUIsTUFBTSxZQUFZLEdBQUcsb0JBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7UUFFNUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUseUJBQWUsQ0FBQywwQkFBMEIsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWUsRUFBRSwyQkFBMkI7UUFDOUMsT0FBTztJQUNYLENBQUM7Q0FDSjtBQXhJRCw0Q0F3SUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBnbG9iYWwgU3ltYm9sICovXG5pbXBvcnQgeyBhc3NpZ25JbiB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcHJvbWlzaWZ5RXZlbnQgZnJvbSAncHJvbWlzaWZ5LWV2ZW50JztcbmltcG9ydCBCUk9XU0VSX0pPQl9SRVNVTFQgZnJvbSAnLi4vLi4vcnVubmVyL2Jyb3dzZXItam9iLXJlc3VsdCc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb24gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgV0FSTklOR19NRVNTQUdFIGZyb20gJy4uLy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1tZXNzYWdlJztcbmltcG9ydCB7IGdlbmVyYXRlVW5pcXVlSWQgfSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcblxuY29uc3QgbmFtZSA9IFN5bWJvbCgpO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCcm93c2VyUHJvdmlkZXJQbHVnaW5Ib3N0IHtcbiAgICBjb25zdHJ1Y3RvciAocHJvdmlkZXJPYmplY3QsIHByb3ZpZGVyTmFtZSkge1xuICAgICAgICB0aGlzLkpPQl9SRVNVTFQgPSBhc3NpZ25Jbih7fSwgQlJPV1NFUl9KT0JfUkVTVUxUKTtcblxuICAgICAgICBhc3NpZ25Jbih0aGlzLCBwcm92aWRlck9iamVjdCk7XG5cbiAgICAgICAgdGhpc1tuYW1lXSA9IHByb3ZpZGVyTmFtZTtcbiAgICB9XG5cblxuICAgIC8vIEhlbHBlcnNcbiAgICBnZXQgcHJvdmlkZXJOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXNbbmFtZV07XG4gICAgfVxuXG4gICAgYXN5bmMgcnVuSW5pdFNjcmlwdCAoYnJvd3NlcklkLCBjb2RlKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBCcm93c2VyQ29ubmVjdGlvbi5nZXRCeUlkKGJyb3dzZXJJZCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ucnVuSW5pdFNjcmlwdChgKCR7Y29kZX0pKClgKTtcbiAgICB9XG5cbiAgICBjYWxjdWxhdGVXaW5kb3dJZCAoKSB7XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZVVuaXF1ZUlkKCk7XG4gICAgfVxuXG4gICAgd2FpdEZvckNvbm5lY3Rpb25SZWFkeSAoYnJvd3NlcklkKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBCcm93c2VyQ29ubmVjdGlvbi5nZXRCeUlkKGJyb3dzZXJJZCk7XG5cbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uaXNSZWFkeSgpKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIHJldHVybiBwcm9taXNpZnlFdmVudChjb25uZWN0aW9uLCAncmVhZHknKTtcbiAgICB9XG5cbiAgICByZXBvcnRXYXJuaW5nIChicm93c2VySWQsIC4uLmFyZ3MpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IEJyb3dzZXJDb25uZWN0aW9uLmdldEJ5SWQoYnJvd3NlcklkKTtcblxuICAgICAgICBjb25uZWN0aW9uLmFkZFdhcm5pbmcoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgc2V0VXNlckFnZW50TWV0YUluZm8gKGJyb3dzZXJJZCwgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gQnJvd3NlckNvbm5lY3Rpb24uZ2V0QnlJZChicm93c2VySWQpO1xuXG4gICAgICAgIGNvbm5lY3Rpb24uc2V0UHJvdmlkZXJNZXRhSW5mbyhtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbG9zZUxvY2FsQnJvd3NlciAoYnJvd3NlcklkKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBCcm93c2VyQ29ubmVjdGlvbi5nZXRCeUlkKGJyb3dzZXJJZCk7XG5cbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5wcm92aWRlci5fZW5zdXJlQnJvd3NlcldpbmRvd0Rlc2NyaXB0b3IoYnJvd3NlcklkKTtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5wcm92aWRlci5fY2xvc2VMb2NhbEJyb3dzZXIoYnJvd3NlcklkKTtcbiAgICB9XG5cbiAgICBhc3luYyByZXNpemVMb2NhbEJyb3dzZXJXaW5kb3cgKGJyb3dzZXJJZCwgd2lkdGgsIGhlaWdodCwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0KSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBCcm93c2VyQ29ubmVjdGlvbi5nZXRCeUlkKGJyb3dzZXJJZCk7XG5cbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5wcm92aWRlci5fZW5zdXJlQnJvd3NlcldpbmRvd1BhcmFtZXRlcnMoYnJvd3NlcklkKTtcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5wcm92aWRlci5fcmVzaXplTG9jYWxCcm93c2VyV2luZG93KGJyb3dzZXJJZCwgd2lkdGgsIGhlaWdodCwgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0KTtcbiAgICB9XG5cbiAgICAvLyBBUElcbiAgICAvLyBCcm93c2VyIGNvbnRyb2xcbiAgICBhc3luYyBvcGVuQnJvd3NlciAoLyogYnJvd3NlcklkLCBwYWdlVXJsLCBicm93c2VyTmFtZSAqLykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCEnKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbG9zZUJyb3dzZXIgKC8qIGJyb3dzZXJJZCAqLykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZCEnKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXphdGlvblxuICAgIGFzeW5jIGluaXQgKCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXN5bmMgZGlzcG9zZSAoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cblxuICAgIC8vIEJyb3dzZXIgbmFtZXMgaGFuZGxpbmdcbiAgICBhc3luYyBnZXRCcm93c2VyTGlzdCAoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkIScpO1xuICAgIH1cblxuICAgIGFzeW5jIGlzVmFsaWRCcm93c2VyTmFtZSAoLyogYnJvd3Nlck5hbWUgKi8pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRXh0cmEgZnVuY3Rpb25zXG4gICAgLy8gTk9URTogVGhlIGJyb3dzZXJOYW1lIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgbXVzdCBiZSBzdXBwbGllZCBpZiB0aGUgYnJvd3NlcklkIGFyZ3VtZW50IGlzIG5vdCB2YWxpZCAoYnJvd3NlciBpcyBub3Qgb3BlbmVkKVxuICAgIGFzeW5jIGlzTG9jYWxCcm93c2VyICgvKiBicm93c2VySWRbLCBicm93c2VyTmFtZV0gKi8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzSGVhZGxlc3NCcm93c2VyICgvKiBicm93c2VySWQgKi8pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGFzeW5jIGhhc0N1c3RvbUFjdGlvbkZvckJyb3dzZXIgKC8qIGJyb3dzZXJJZCAqLykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaGFzQ2xvc2VCcm93c2VyOiAgICAgICAgICAgICAgICB0aGlzLmhhc093blByb3BlcnR5KCdjbG9zZUJyb3dzZXInKSxcbiAgICAgICAgICAgIGhhc1Jlc2l6ZVdpbmRvdzogICAgICAgICAgICAgICAgdGhpcy5oYXNPd25Qcm9wZXJ0eSgncmVzaXplV2luZG93JyksXG4gICAgICAgICAgICBoYXNUYWtlU2NyZWVuc2hvdDogICAgICAgICAgICAgIHRoaXMuaGFzT3duUHJvcGVydHkoJ3Rha2VTY3JlZW5zaG90JyksXG4gICAgICAgICAgICBoYXNHZXRWaWRlb0ZyYW1lRGF0YTogICAgICAgICAgIHRoaXMuaGFzT3duUHJvcGVydHkoJ2dldFZpZGVvRnJhbWVEYXRhJyksXG4gICAgICAgICAgICBoYXNDYW5SZXNpemVXaW5kb3dUb0RpbWVuc2lvbnM6IHRoaXMuaGFzT3duUHJvcGVydHkoJ2NhblJlc2l6ZVdpbmRvd1RvRGltZW5zaW9ucycpLFxuICAgICAgICAgICAgaGFzTWF4aW1pemVXaW5kb3c6ICAgICAgICAgICAgICB0aGlzLmhhc093blByb3BlcnR5KCdtYXhpbWl6ZVdpbmRvdycpLFxuICAgICAgICAgICAgaGFzQ2hyb21lbGVzc1NjcmVlbnNob3RzOiAgICAgICBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGFzeW5jIHJlc2l6ZVdpbmRvdyAoYnJvd3NlcklkLyosIHdpZHRoLCBoZWlnaHQsIGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodCAqLykge1xuICAgICAgICB0aGlzLnJlcG9ydFdhcm5pbmcoYnJvd3NlcklkLCBXQVJOSU5HX01FU1NBR0UucmVzaXplTm90U3VwcG9ydGVkQnlCcm93c2VyUHJvdmlkZXIsIHRoaXNbbmFtZV0pO1xuICAgIH1cblxuICAgIGFzeW5jIGNhblJlc2l6ZVdpbmRvd1RvRGltZW5zaW9ucyAoLyogYnJvd3NlcklkLCB3aWR0aCwgaGVpZ2h0ICovKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGFzeW5jIHRha2VTY3JlZW5zaG90IChicm93c2VySWQvKiwgc2NyZWVuc2hvdFBhdGgsIHBhZ2VXaWR0aCwgcGFnZUhlaWdodCAqLykge1xuICAgICAgICB0aGlzLnJlcG9ydFdhcm5pbmcoYnJvd3NlcklkLCBXQVJOSU5HX01FU1NBR0Uuc2NyZWVuc2hvdE5vdFN1cHBvcnRlZEJ5QnJvd3NlclByb3ZpZGVyLCB0aGlzW25hbWVdKTtcbiAgICB9XG5cbiAgICBhc3luYyBtYXhpbWl6ZVdpbmRvdyAoYnJvd3NlcklkKSB7XG4gICAgICAgIHRoaXMucmVwb3J0V2FybmluZyhicm93c2VySWQsIFdBUk5JTkdfTUVTU0FHRS5tYXhpbWl6ZU5vdFN1cHBvcnRlZEJ5QnJvd3NlclByb3ZpZGVyLCB0aGlzW25hbWVdKTtcbiAgICB9XG5cbiAgICBhc3luYyBnZXRWaWRlb0ZyYW1lRGF0YSAoYnJvd3NlcklkKSB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJBbGlhcyA9IEJyb3dzZXJDb25uZWN0aW9uLmdldEJ5SWQoYnJvd3NlcklkKS5icm93c2VySW5mby5hbGlhcztcblxuICAgICAgICB0aGlzLnJlcG9ydFdhcm5pbmcoYnJvd3NlcklkLCBXQVJOSU5HX01FU1NBR0UudmlkZW9Ob3RTdXBwb3J0ZWRCeUJyb3dzZXIsIGJyb3dzZXJBbGlhcyk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVwb3J0Sm9iUmVzdWx0ICgvKmJyb3dzZXJJZCwgc3RhdHVzLCBkYXRhKi8pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbn1cbiJdfQ==