@applitools/eyes-nightwatch
Version:
Applitools Eyes SDK for Nightwatch.js
214 lines (213 loc) • 9.7 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.build = exports.findElements = exports.findElement = exports.toSimpleCommonSelector = exports.toSelector = exports.toElement = exports.toDriver = exports.isSelector = exports.isSecondaryElement = exports.isSecondaryDriver = void 0;
const spec = __importStar(require("@applitools/spec-driver-webdriver"));
const utils = __importStar(require("@applitools/utils"));
__exportStar(require("@applitools/spec-driver-webdriver"), exports);
const byHash = ['className', 'css', 'id', 'js', 'linkText', 'name', 'partialLinkText', 'tagName', 'xpath'];
function isByHashSelector(selector) {
return byHash.includes(Object.keys(selector)[0]);
}
const XPATH_SELECTOR_START = ['/', '(', '../', './', '*/'];
function isXpathSelector(selector) {
return XPATH_SELECTOR_START.some(start => selector.startsWith(start));
}
function isSecondaryDriver(driver) {
return utils.types.instanceOf(driver, 'NightwatchAPI') || spec.isSecondaryDriver(driver);
}
exports.isSecondaryDriver = isSecondaryDriver;
function isSecondaryElement(element) {
return ((utils.types.has(element, 'value') && spec.isElement(element.value)) ||
utils.types.has(element, 'webElement') ||
utils.types.instanceOf(element, 'WebElement'));
}
exports.isSecondaryElement = isSecondaryElement;
function isSelector(selector) {
if (!selector)
return false;
return (spec.isSelector(selector) ||
utils.types.isString(selector) ||
(utils.types.has(selector, 'selector') && utils.types.isString(selector.selector)) ||
isByHashSelector(selector) ||
utils.types.isFunction(selector) ||
utils.types.instanceOf(selector, 'RelativeBy'));
}
exports.isSelector = isSelector;
function toDriver(driver) {
var _a, _b, _c, _d;
if (spec.isDriver(driver))
return driver;
if (spec.isSecondaryDriver(driver))
return spec.toDriver(driver);
const selenium = driver.options.selenium;
const webdriver = driver.options.webdriver;
const ssl = (_a = selenium === null || selenium === void 0 ? void 0 : selenium.ssl) !== null && _a !== void 0 ? _a : webdriver === null || webdriver === void 0 ? void 0 : webdriver.ssl;
const hostname = (_b = selenium === null || selenium === void 0 ? void 0 : selenium.host) !== null && _b !== void 0 ? _b : webdriver === null || webdriver === void 0 ? void 0 : webdriver.host;
const port = (_c = selenium === null || selenium === void 0 ? void 0 : selenium.port) !== null && _c !== void 0 ? _c : webdriver === null || webdriver === void 0 ? void 0 : webdriver.port;
const path = (_d = selenium === null || selenium === void 0 ? void 0 : selenium.default_path_prefix) !== null && _d !== void 0 ? _d : webdriver === null || webdriver === void 0 ? void 0 : webdriver.default_path_prefix;
return spec.toDriver({
sessionId: driver.sessionId,
serverUrl: `http${ssl ? 's' : ''}://${hostname !== null && hostname !== void 0 ? hostname : 'localhost'}${port ? `:${port}` : ''}${path}`,
capabilities: driver.capabilities,
original: driver,
});
}
exports.toDriver = toDriver;
function toElement(element) {
if (utils.types.has(element, 'value')) {
return element.value;
}
else if (utils.types.instanceOf(element, 'WebElement')) {
return element.getId().then(elementId => spec.toElement({ elementId }));
}
return element;
}
exports.toElement = toElement;
function toSelector(selector) {
if (utils.types.isString(selector)) {
return { locateStrategy: isXpathSelector(selector) ? 'xpath' : 'css selector', selector };
}
else if (utils.types.has(selector, 'selector')) {
if (!utils.types.isString(selector.selector))
return selector.selector;
if (!utils.types.has(selector, 'type')) {
return {
locateStrategy: isXpathSelector(selector.selector) ? 'xpath' : 'css selector',
selector: selector.selector,
};
}
if (selector.type === 'css')
return { locateStrategy: 'css selector', selector: selector.selector };
else
return { locateStrategy: selector.type, selector: selector.selector };
}
return selector;
}
exports.toSelector = toSelector;
function toSimpleCommonSelector(selector) {
if (utils.types.instanceOf(selector, 'RelativeBy') || utils.types.isFunction(selector)) {
return null;
}
else if (utils.types.isString(selector)) {
return { selector };
}
else if (isByHashSelector(selector)) {
const [[how, what]] = Object.entries(selector);
if (how === 'js')
return null;
const Selenium = require('selenium-webdriver');
selector = Selenium.By[how](what);
}
if (utils.types.has(selector, ['using', 'value'])) {
selector = { locateStrategy: selector.using, selector: selector.value };
}
if (utils.types.has(selector, 'selector') && selector.locateStrategy) {
return {
type: selector.locateStrategy === 'css selector' ? 'css' : selector.locateStrategy,
selector: selector.selector,
};
}
return selector;
}
exports.toSimpleCommonSelector = toSimpleCommonSelector;
async function findElement(driver, selector, parent) {
if (utils.types.has(selector, 'selector') && selector.locateStrategy && !selector.index) {
return spec.findElement(driver, { using: selector.locateStrategy, value: selector.selector }, parent);
}
try {
return await driver.original.findElement(selector);
}
catch {
return null;
}
}
exports.findElement = findElement;
async function findElements(driver, selector, parent) {
if (utils.types.has(selector, 'selector') && selector.locateStrategy && !selector.index) {
return spec.findElements(driver, { using: selector.locateStrategy, value: selector.selector }, parent);
}
try {
return await driver.original.findElements(selector);
}
catch {
return [];
}
}
exports.findElements = findElements;
const browserOptionsNames = {
chrome: 'goog:chromeOptions',
firefox: 'moz:firefoxOptions',
};
async function build(env) {
var _a;
const Nightwatch = require('nightwatch');
const parseEnv = require('@applitools/test-utils/src/parse-env');
const { browser = '', capabilities, url, configurable = true, args = [], headless, logLevel = 'silent', } = parseEnv({ ...env, legacy: (_a = env.legacy) !== null && _a !== void 0 ? _a : process.env.APPLITOOLS_FRAMEWORK_MAJOR_VERSION === '1' });
const options = {
capabilities: { browserName: browser, ...capabilities },
webdriver: {
host: url.hostname,
port: url.port || (url.protocol.startsWith('https') ? 443 : undefined),
default_path_prefix: url.pathname,
check_process_delay: 100,
max_status_poll_tries: 10,
status_poll_interval: 200,
process_create_timeout: 120000,
timeout_options: { timeout: 2147483647 /* 32 bit positive int */, retry_attempts: 0 },
start_session: true,
start_process: false,
},
output: logLevel !== 'silent',
config: null,
useAsync: true,
};
if (configurable) {
const browserOptionsName = browserOptionsNames[browser || options.capabilities.browserName];
if (browserOptionsName) {
const browserOptions = options.capabilities[browserOptionsName] || {};
browserOptions.args = [...(browserOptions.args || []), ...args];
if (headless)
browserOptions.args.push('headless');
if (browser === 'firefox') {
options.capabilities.alwaysMatch = { [browserOptionsName]: browserOptions };
}
else {
options.capabilities[browserOptionsName] = browserOptions;
}
// if (browser !== 'firefox' && !browserOptions.mobileEmulation) browserOptions.w3c = false
}
}
if (options.capabilities.browserName === '')
options.capabilities.browserName = null;
if (options.capabilities.browserName !== 'firefox')
options.selenium = options.webdriver;
const driver = await Nightwatch.createClient(options).launchBrowser();
return [driver, () => driver.end()];
}
exports.build = build;