testplane
Version:
Tests framework based on mocha and wdio
87 lines • 3.98 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = __importDefault(require("lodash"));
const page_loader_1 = __importDefault(require("../../utils/page-loader"));
const emptyPageUrl = "about:blank";
const is = {
image: match => match.headers?.Accept?.includes("image"),
stylesheet: match => match.headers?.Accept?.includes("text/css"),
font: match => lodash_1.default.isString(match.url) && [".ttf", ".woff", ".woff2"].some(ext => match.url.endsWith(ext)),
favicon: match => lodash_1.default.isString(match.url) && match.url.endsWith("/favicon.ico"),
};
const makeOpenAndWaitCommand = (config, session) => function openAndWait(uri, { selector = [], predicate, waitNetworkIdle = config.openAndWaitOpts?.waitNetworkIdle, waitNetworkIdleTimeout = config.openAndWaitOpts?.waitNetworkIdleTimeout, failOnNetworkError = config.openAndWaitOpts?.failOnNetworkError, shouldThrowError = shouldThrowErrorDefault, ignoreNetworkErrorsPatterns = config.openAndWaitOpts?.ignoreNetworkErrorsPatterns, timeout = config.openAndWaitOpts?.timeout || config?.pageLoadTimeout || 0, } = {}) {
const isChrome = config.desiredCapabilities?.browserName === "chrome";
const isCDP = config.automationProtocol === "devtools";
waitNetworkIdle &&= isChrome || isCDP;
if (!uri || uri === emptyPageUrl) {
return new Promise(resolve => {
session.url(uri).then(() => resolve());
});
}
const selectors = typeof selector === "string" ? [selector] : selector;
const pageLoader = new page_loader_1.default(session, {
selectors,
predicate,
timeout,
waitNetworkIdle,
waitNetworkIdleTimeout,
});
let selectorsResolved = !selectors.length;
let predicateResolved = !predicate;
let networkResolved = !waitNetworkIdle;
return new Promise((resolve, reject) => {
const handleError = (err) => {
reject(new Error(`url: ${err.message}`));
};
const checkLoaded = () => {
if (selectorsResolved && predicateResolved && networkResolved) {
resolve();
}
};
const goToPage = async () => {
await session.url(uri);
};
pageLoader.on("pageLoadError", handleError);
pageLoader.on("selectorsError", handleError);
pageLoader.on("predicateError", handleError);
pageLoader.on("networkError", match => {
if (!failOnNetworkError) {
return;
}
const shouldIgnore = isMatchPatterns(ignoreNetworkErrorsPatterns, match.url);
if (!shouldIgnore && shouldThrowError(match)) {
reject(new Error(`url: couldn't get content from ${match.url}: ${match.statusCode}`));
}
});
pageLoader.on("selectorsExist", () => {
selectorsResolved = true;
checkLoaded();
});
pageLoader.on("predicateResolved", () => {
predicateResolved = true;
checkLoaded();
});
pageLoader.on("networkResolved", () => {
networkResolved = true;
checkLoaded();
});
pageLoader.load(goToPage).then(checkLoaded);
}).finally(() => pageLoader.unsubscribe());
};
exports.default = (browser) => {
const { publicAPI: session, config } = browser;
session.addCommand("openAndWait", makeOpenAndWaitCommand(config, session));
};
function isMatchPatterns(patterns = [], str) {
return patterns.some(pattern => (lodash_1.default.isString(pattern) ? str.includes(pattern) : pattern.exec(str)));
}
function shouldThrowErrorDefault(match) {
if (is.favicon(match)) {
return false;
}
return is.image(match) || is.stylesheet(match) || is.font(match);
}
//# sourceMappingURL=openAndWait.js.map