@applitools/dom-utils
Advanced tools
Comparing version 4.5.3 to 4.6.0
@@ -6,2 +6,14 @@ # Change Log | ||
# [4.6.0](https://github.com/applitools/eyes.sdk.javascript1/compare/@applitools/dom-utils@4.5.3...@applitools/dom-utils@4.6.0) (2019-02-19) | ||
### Bug Fixes | ||
* **dom-utils:** fix regexp for replacing unfetched CSSs ([8d81b47](https://github.com/applitools/eyes.sdk.javascript1/commit/8d81b47)) | ||
* **dom-utils:** update `@applitools/dom-capture` to version 7.0.5 ([96f1b2c](https://github.com/applitools/eyes.sdk.javascript1/commit/96f1b2c)) | ||
## [4.5.3](https://github.com/applitools/eyes.sdk.javascript1/compare/@applitools/dom-utils@4.5.2...@applitools/dom-utils@4.5.3) (2019-02-14) | ||
@@ -8,0 +20,0 @@ |
@@ -9,2 +9,7 @@ 'use strict'; | ||
const DomCaptureReturnType = { | ||
OBJECT: 'OBJECT', | ||
STRING: 'STRING', | ||
}; | ||
class DomCapture { | ||
@@ -25,6 +30,6 @@ | ||
* @param {PositionProvider} [positionProvider] | ||
* @param {string} [returnType] | ||
* @param {DomCaptureReturnType} [returnType] | ||
* @return {Promise<string|object>} | ||
*/ | ||
static async getFullWindowDom(logger, driver, positionProvider, returnType = 'string') { | ||
static async getFullWindowDom(logger, driver, positionProvider, returnType = DomCaptureReturnType.STRING) { | ||
ArgumentGuard.notNull(logger, 'logger'); | ||
@@ -46,7 +51,7 @@ ArgumentGuard.notNull(driver, 'driver'); | ||
return returnType === 'object' ? dom : JSON.stringify(dom); | ||
return returnType === DomCaptureReturnType.OBJECT ? JSON.parse(dom) : dom; | ||
} | ||
/** | ||
* @return {Promise<object>} | ||
* @return {Promise<{string}>} | ||
*/ | ||
@@ -63,19 +68,27 @@ async getWindowDom() { | ||
let domSnapshot = await this.getFrameDom(asyncCaptureDomScript, url); | ||
return JSON.parse(domSnapshot); | ||
return this.getFrameDom(asyncCaptureDomScript, url); | ||
} | ||
/** | ||
* @param script | ||
* @param url | ||
* @return {Promise<{string}>} | ||
*/ | ||
async getFrameDom(script, url) { | ||
let domSnapshot = await this.driver.executeAsyncScript(script); | ||
let domSnapshotRaw = await this.driver.executeAsyncScript(script); | ||
const cssIndex = domSnapshot.indexOf('#####'); | ||
const iframeIndex = domSnapshot.indexOf('@@@@@'); | ||
const separatorIndex = domSnapshot.indexOf('-----'); | ||
const domSnapshotRawArr = domSnapshotRaw ? domSnapshotRaw.split('\n') : []; | ||
if (domSnapshotRawArr.length === 0 ) { | ||
return {}; | ||
} | ||
const separatorJson = JSON.parse(domSnapshotRawArr[0]); | ||
const cssEndIndex = domSnapshotRawArr.indexOf(separatorJson.separator); | ||
const iframeEndIndex = domSnapshotRawArr.indexOf(separatorJson.separator, cssEndIndex + 1); | ||
let domSnapshot = domSnapshotRawArr[iframeEndIndex + 1]; | ||
let cssArr = []; | ||
if (cssIndex !== -1 && cssIndex < separatorIndex) { | ||
const cssSeparatorIndex = iframeIndex !== -1 && separatorIndex !== -1 ? Math.min(iframeIndex, separatorIndex) : Math.max(iframeIndex, separatorIndex); | ||
const cssText = domSnapshot.substring(cssIndex + 6, cssSeparatorIndex); | ||
cssArr = cssText.split('\n'); | ||
for (let i = 1; i < cssEndIndex; i++) { | ||
cssArr.push(domSnapshotRawArr[i]); | ||
} | ||
@@ -94,15 +107,10 @@ | ||
for (const cssRes of cssResArr) { | ||
domSnapshot = domSnapshot.replace(`#####${cssRes.href}#####`, cssRes.css); | ||
domSnapshot = domSnapshot.replace(`"${separatorJson.cssStartToken}${cssRes.href}${separatorJson.cssEndToken}"`, cssRes.css); | ||
} | ||
let iframeArr = []; | ||
if (iframeIndex !== -1 && iframeIndex < separatorIndex) { | ||
const iframesText = domSnapshot.substring(iframeIndex + 6, separatorIndex); | ||
iframeArr = iframesText.split('\n'); | ||
for (let i = cssEndIndex + 1; i < iframeEndIndex; i++) { | ||
iframeArr.push(domSnapshotRawArr[i]); | ||
} | ||
if (cssIndex < separatorIndex && iframeIndex < separatorIndex && (cssIndex !== -1 || iframeIndex !== -1) && separatorIndex !== -1) { | ||
domSnapshot = domSnapshot.substring(separatorIndex + 6); | ||
} | ||
for (const iframeXpath of iframeArr) { | ||
@@ -112,3 +120,3 @@ if (!iframeXpath) { | ||
} | ||
await this._switchToFrame(iframeXpath); | ||
const framesCount = await this._switchToFrame(iframeXpath); | ||
let domIFrame; | ||
@@ -120,4 +128,4 @@ try { | ||
} | ||
await this._driver.switchTo().parentFrame(); | ||
domSnapshot = domSnapshot.replace(`"@@@@@${iframeXpath}@@@@@"`, domIFrame); | ||
await this._switchToParentFrame(framesCount); | ||
domSnapshot = domSnapshot.replace(`"${separatorJson.iframeStartToken}${iframeXpath}${separatorJson.iframeEndToken}"`, domIFrame); | ||
} | ||
@@ -130,3 +138,3 @@ | ||
* @param {string|string[]} xpaths | ||
* @return {Promise<void>} | ||
* @return {Promise<number>} | ||
* @private | ||
@@ -139,8 +147,23 @@ */ | ||
const iframeEl = await this.driver.findElementByXPath(`/${xpaths[0]}`); | ||
await this._driver.switchTo().frame(iframeEl); | ||
let framesCount = 0; | ||
for (const xpath of xpaths) { | ||
const iframeEl = await this.driver.findElementByXPath(`/${xpath}`); | ||
await this._driver.switchTo().frame(iframeEl); | ||
framesCount = framesCount + 1; | ||
} | ||
if (xpaths.length > 1) { | ||
await this._switchToFrame(xpaths.shift()); | ||
return framesCount; | ||
} | ||
/** | ||
* @private | ||
* @return {Promise<number>} | ||
*/ | ||
async _switchToParentFrame(switchedToFrameCount) { | ||
if (switchedToFrameCount > 0) { | ||
await this._driver.switchTo().parentFrame(); | ||
return this._switchToParentFrame(switchedToFrameCount - 1); | ||
} | ||
return switchedToFrameCount; | ||
} | ||
@@ -158,11 +181,12 @@ | ||
this._logger.verbose(`Given URL to download: ${href}`); | ||
let absHref = href; | ||
if (!GeneralUtils.isAbsoluteUrl(href)) { | ||
href = new URL(href.toString(), baseUri).href; | ||
absHref = new URL(href.toString(), baseUri).href; | ||
} | ||
const timeStart = PerformanceUtils.start(); | ||
const response = await axios(href); | ||
const response = await axios(absHref); | ||
const css = response.data; | ||
this._logger.verbose(`downloading CSS in length of ${css.length} chars took ${timeStart.end().summary}`); | ||
return {'href': href, 'css': css}; | ||
return {'href': absHref, 'css': css}; | ||
} catch (ex) { | ||
@@ -183,2 +207,4 @@ this._logger.verbose(ex.toString()); | ||
Object.freeze(DomCaptureReturnType); | ||
exports.DomCaptureReturnType = DomCaptureReturnType; | ||
exports.DomCapture = DomCapture; |
{ | ||
"name": "@applitools/dom-utils", | ||
"version": "4.5.3", | ||
"version": "4.6.0", | ||
"description": "Applitools DOM Utils is a shared utility package", | ||
@@ -27,4 +27,4 @@ "keywords": [ | ||
"dependencies": { | ||
"@applitools/dom-capture": "^6.1.5", | ||
"@applitools/eyes-common": "^1.2.4", | ||
"@applitools/dom-capture": "^7.0.5", | ||
"@applitools/eyes-common": "^1.3.0", | ||
"axios": "^0.18.0" | ||
@@ -45,3 +45,3 @@ }, | ||
}, | ||
"gitHead": "a3ac9dbb3fed4bb64a9afdc6d060d2f6ab09d1e1" | ||
"gitHead": "1e1eb86043169895a3d1e5535fd123fe4a8217c1" | ||
} |
25664
168
+ Added@applitools/dom-capture@7.3.0(transitive)
+ Added@applitools/functional-commons@1.5.4(transitive)
- Removed@applitools/dom-capture@6.1.5(transitive)
- Removed@applitools/functional-commons@1.6.0(transitive)