@testim/testim-cli 4.39.0 → 4.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +1 -1
- package/cli.js.map +2 -2
- package/npm-shrinkwrap.json +129 -60
- package/package.json +1 -1
package/cli.js
CHANGED
|
@@ -217,7 +217,7 @@ Action required: Please allow opening a websockets connection to ${me} in your f
|
|
|
217
217
|
Please make sure the CLI has stable access to the internet. ${Ga()?"(Internal: network connectivity test failed)":""}`,n=f=>{let{DEVICE_OS_VERSION_TOO_LOW:h,APP_NOT_EXIST_ON_DEVICE:y,APP_NEVER_STARTED:v,TIMEOUT_ERROR:I,SAUCELABS_APP_IS_NOT_INSTALLED:b}=Xa,T=f instanceof Error?f.message:f;return T.replace(/(Visit\s+)?(https?:\/\/\S+)?(\s+)?(for\s+troubleshooting(\.)?)?/gi,""),T.includes(Jg)||T.includes(I)?{errorType:En,reason:"timeout while getting device"}:T.includes(y)||T.includes(b)?{errorType:Ii,reason:"app doesn't exist on device"}:T.includes(v)?{errorType:Ii,reason:"app never started, check app permission or app activity"}:T.includes(h)?{errorType:Ii,reason:"Unable to install app: DeviceOSVersionTooLow"}:{errorType:Ii,reason:T}},o=(f,h)=>{let y=this.options.mode===Y.APPIUM?"device":"browser";if(!h&&M.flags.errorMessageOnBadNetwork.isEnabled())return{errorType:IE,reason:r()};let v=f instanceof Error?f.message:f;if(v.includes(Jg))return{errorType:En,reason:`Test couldn't get ${y}`};if(v.includes(Yg))return{errorType:En,reason:"Test couldn't be started"};if(v.includes(Xg)){if(!this.testRunTimeout)return{errorType:En,reason:"Test timeout reached: test is too long"};let I=Su.default.duration({milliseconds:this.testRunTimeout}),b=Math.floor(I.asMinutes()),T=I.asSeconds(),R=b>0?` ${b} min`:"",C=T>0?` ${T} sec`:"";return{errorType:En,reason:`Test timeout reached (timeout:${R}${C}): test is too long`}}if(f instanceof ur&&f.type){if(f.type===vu)return{errorType:vu,reason:`Test couldn't get ${y} from grid - ${f.message}`};if(f.type===or)return{errorType:or,reason:`Failed to create new session - ${f.message}`}}return"type"in f&&f.type===RE?{errorType:or,reason:`Session terminated, this is often caused to connection
|
|
218
218
|
problems between the Testim CLI and the grid running the test. Please check your network connection.`}:/SeleniumError: connect ECONNREFUSED/.test(f.message)||/Couldn't connect to selenium server/.test(f.message)?{errorType:or,reason:"Failed to connect to the grid, please check if the grid is accessible from your network"}:/terminated due to FORWARDING_TO_NODE_FAILED/.test(f.message)?{errorType:or,reason:"Session terminated, it is likely that the grid is out of memory or not responding, please try to rerun the test"}:/terminated due to PROXY_REREGISTRATION/.test(f.message)?{errorType:or,reason:"Session terminated, it is likely that the grid is not responding, please try to rerun the test"}:/forwarding the new session cannot find : Capabilities/.test(f.message)?{errorType:or,reason:`Session could not be created, please check that the ${y} you requested is supported in your plan`}:{errorType:xE,reason:v}},i=async(f,h)=>{var T;let y=await Va();!y&&M.flags.warnOnBadNetwork.isEnabled()&&console.warn(r()),gt.warn("error on run",{err:f});let v=(T=this.userData)==null?void 0:T.projectId,{errorType:I,reason:b}=this.options.mode===Y.APPIUM?n(f):o(f,y);xo(v,this.testResultId,this.testId,{status:Ds.COMPLETED,success:!1,reason:b,errorType:I,testRetryKey:h.retryKey,setupStepResult:{status:Ds.COMPLETED,success:!1,reason:b,errorType:I}},h.remoteRunId),await t(CE(this.testId,this.testName,this.testResultId,b),h,f)},a=async(f,h)=>{var T;let y=this.testId,v=this.testResultId,I=(T=this.userData)==null?void 0:T.projectId,b=this.branch;if(!y||!v||!I||!b)return gt.warn("Test failed. Not enough data to recover results via API",{err:f}),i(f,h);try{let R=await Tr(y,v,I,b);if(gt.warn("Test failed. Got results via API",{err:f,testResult:Qg.default.omit(R,kE)}),R&&R.status===Ds.COMPLETED)return await t(R,h);throw f}catch(R){return R!==f&>.error("Failed to fetch test results from server",{testId:y,resultId:v,projectId:I,branch:b,err:R}),i(f,h)}},c=this.options.disableSockets||((p=this.options.lightweightMode)==null?void 0:p.disableResults)&&(this.options.useChromeLauncher||this.options.mode!=="extension"),l=this.options.disableSockets||((g=this.options.lightweightMode)==null?void 0:g.disableRemoteStep),m=async(f,h)=>{try{await Promise.all([!l&&us.joinToRemoteStep(this.testResultId),!c&&Ct.joinToTestResult(this.testResultId,this.testId)]),this.options.mode!==Y.APPIUM&&f.validateRunConfig();let y=await this.runTest(f,this.customExtensionLocalLocation,h),v=await t(y,f);return L("After onRunComplete"),v}catch(y){return a(y,f)}finally{l||us.unlistenToRemoteStep(this.testResultId)}},d=this.executionQueue.getNext();return d?(this.testId=d.testId,this.testName=d.testName,this.testResultId=d.testResultId,this.overrideTestConfigId=d.overrideTestConfigId,this.testRunConfig=d.runConfig,this.branch=d.branch,m(d)):this.onQueueCompleted()}}});var Iu,eh,ps,Ru=w(()=>{"use strict";j();Iu=E(require("p-retry"));j();B();z();eh=x("window-utils"),ps=class{constructor(e,t){this.id=e;this.driver=t}async getElementFromPoint(e,t){function r(o,i){let a=document.elementFromPoint(o,i);return{testimId:a?a.getAttribute("testim_dom_element_id"):null,tagName:a?a.tagName:null}}let{value:n}=await this.driver.executeJS(r,e,t);return n}getLocation(){return this.driver.getUrl()}async stopListeningToScroll(){}async resumeListeningToScroll(){}scrollToPosition(e){return this.driver.scroll(e.x,e.y)}scrollToPositionWithoutAnimation(e){function t(r){return"scrollBehavior"in document.documentElement.style?window.scrollTo({left:r.x,top:r.y,behavior:"instant"}):window.scrollTo(r.x,r.y)}return this.driver.executeJS(t,e)}async getCurrentScrollPosition(){function e(){return{x:window.scrollX,y:window.scrollY}}let{value:t}=await this.driver.executeJS(e);return t}navigate(e,t=15e3){let r=async(n=3)=>{try{await this.driver.url(e)}catch(o){let i=o.message.includes("method IWebBrowser2::Navigate2() failed");if(o.seleniumStack&&i&&n>0)return eh.warn("selenium navigation failed. retrying to navigate",{err:o}),await oe(1500),r(n-1);throw!o.seleniumStack&&i&&eh.warn("selenium navigation failed. Due to wdio7 the error is unhandled",{err:o}),o}};return Promise.race([r(),oe(t)])}reloadTab(e=15e3){return Promise.race([this.driver.reloadTab(),oe(e)])}async getZoom(){function e(){return{zoomLevel:window.outerWidth/window.innerWidth}}let{value:t}=await this.driver.executeJS(e);return t}getViewportSize(){return this.driver.getViewportSize()}maximizeWithoutValidation(){return this.driver.maximizeWithoutValidation()}async getFullPageSize(){function e(){let r=document.body,n=document.documentElement,o=Math.max(r.scrollHeight,r.offsetHeight,n.clientHeight,n.scrollHeight,n.offsetHeight),i=Math.max(r.scrollWidth,r.offsetWidth,n.clientWidth,n.scrollWidth,n.offsetWidth);return{height:o,width:i}}let{value:t}=await this.driver.executeJS(e);return t}async extractToNewWindow(){}async checkSize(e){await oe(1e3);let t=await this.getViewportSize();if(t.width!==e.width||t.height!==e.height)throw Object.assign(new Error("checkSize failed"),{actualSize:t,expectedSize:e});return{actualSize:t,expectedSize:e}}async setViewportSize(e){return await this.driver.setViewportSize(e.width,e.height),await this.checkSize(e)}async validatePageIsAvailable(){function e(){let r;if(typeof location<"u")r=location;else if(typeof window<"u"&&typeof window.location<"u")r=window.location;else return!1;return r.href!=="chrome-error://chromewebdata/"&&r.href!=="safari-resource:/ErrorPage.html"&&r.href.indexOf("res://ieframe.dll/http_404.htm")!==0&&r.href.indexOf("ms-appx-web://microsoft.microsoftedge/assets/errorpages/")!==0}if(!(await this.driver.executeJS(e)).value)throw new bt("validatePageIsAvailable:PageNotAvailableError")}focusTab(){return this.driver.switchTab(this.id)}quit(){}async getOsAndBrowser(){let e=await(0,Iu.default)(()=>this.driver.getBrowserAndOS(),{retries:3,factor:1});return{uaBrowserName:e.browser,uaOs:e.os,userAgent:e.userAgent,browserVersion:e.browserVersion}}getUserAgentInfo(){return(0,Iu.default)(()=>this.driver.getUserAgentInfo(),{retries:3,factor:1})}}});var xu,ds,Au=w(()=>{"use strict";B();xu=x("cookies-utils"),ds=class{constructor(e){this.driver=e}async set(e){let t=e.domain;!e.hostOnly&&t&&!t.startsWith(".")&&(t=`.${t}`);try{return await this.driver.setCookie(e.name,e.value,t,e.httpOnly,e.secure,e.path,e.expirationDate)}catch(r){throw xu.error("failed to set cookie",{err:r}),r}}async get(e){try{return await this.driver.getCookie(e.name)}catch(t){throw xu.error("failed to get cookie",{err:t}),t}}async remove(e){try{return await this.driver.deleteCookie(e.name)}catch(t){throw xu.error("failed to remove cookie",{err:t}),t}}}});var Pu,xi,th=w(()=>{"use strict";Pu=E(require("p-retry")),xi=class{constructor(e,t,r={takeScreenshots:!0}){this.tabId=e;this.driver=t;this.options=r;this.screencastHandler=void 0}base64AddPadding(e){return e+Array((4-e.length%4)%4+1).join("=")}shouldTakeScreenshots(){return typeof this.options.takeScreenshots!="boolean"?!0:this.options.takeScreenshots}async takeScreenshot(){if(!this.shouldTakeScreenshots())return{devicePixelRatio:1,image:""};let e=3,t=2e3,r=this.currentDevicePixelRatio||this.getDevicePixelRatio(),n=()=>Promise.all([r,this.driver.takeScreenshot()]),[o,i]=await(0,Pu.default)(n,{retries:e,minTimeout:t,factor:1}),a=i?i.value:"";return{image:`data:image/png;base64,${this.base64AddPadding(a.replace(/[\r\n]/g,""))}`,devicePixelRatio:o}}async takeElementScreenshot(e){if(!this.shouldTakeScreenshots())return{devicePixelRatio:1,image:""};let t=3,r=2e3,n=this.currentDevicePixelRatio?Promise.resolve(this.currentDevicePixelRatio):this.getDevicePixelRatio(),o=()=>Promise.all([n,this.driver.takeElementScreenshot(e)]),[i,a]=await(0,Pu.default)(o,{retries:t,minTimeout:r,factor:1}),c=a||"";return{image:`data:image/png;base64,${this.base64AddPadding(c.replace(/[\r\n]/g,""))}`,devicePixelRatio:i}}async getDevicePixelRatio(){function e(){try{return window.devicePixelRatio}catch{return 1}}let{value:t}=await this.driver.executeJS(e);return t}forcePixelRatio(e=1){return this.currentDevicePixelRatio=e,Promise.resolve()}getCurrentDevicePixelRatio(){return this.currentDevicePixelRatio}}});async function rh(s,e){let t=e.image||e,r=e.devicePixelRatio;if(!t)throw new Error("Failed to get image");let n=t.match(/^data:[^;]*;base64,(.*)$/);if(!n)throw new Error("Image is not in base64 format");let o=s.offset||{top:0,left:0};if(o.top*=r,o.left*=r,!s.elementRect)return OE.warn("missing elementRect",nh.omit(s,"image")),{};let{elementRect:i}=s,a=await ms.default.read(Buffer.from(n[1],"base64")),c=i.left*r+o.left*r,l=i.top*r+o.top*r,m=i.width*r,d=i.height*r;c<0&&(m+=c,m=m<0?0:m,c=0),l<0&&(d+=l,d=d<0?0:d,l=0);let p=a.bitmap.width,g=a.bitmap.height;if(c+m>p&&(m=p-c),l+d>g&&(d=g-l),d<=0||m<=0)throw new Cu("height or width is equal or lower than zero");return{elementImage:await a.crop(c,l,m,d).getBase64Async(ms.default.MIME_PNG)}}async function _E(s,e){let t=await ms.default.read(s.width,s.height);for(let n of e){let o=n.image.match(/^data:[^;]*;base64,(.*)$/),i=await ms.default.read(Buffer.from(o[1],"base64"));await new Promise((a,c)=>{t.composite(i,n.position.left,n.position.top,l=>{if(l){c(l);return}a()})})}return await t.getBase64Async(ms.default.MIME_PNG)}function LE(s,e){return _E(s,e)}async function DE(){}async function ME(s){function e(o){let i=s[o];return typeof i=="string"&&i.startsWith("data")}async function t(o){let i=await DE(s[o]);return{key:o,url:i}}let r=await ie(Object.keys(s).filter(e),t),n=Object.fromEntries(r.map(o=>[o.key,o.url]));return Object.assign(s,n)}function sh(s,e){return e||=1,s||={left:0,top:0,width:0,height:0},{left:e*Math.round(s.left),top:e*Math.round(s.top),width:e*Math.round(s.width),height:e*Math.round(s.height),pixelRatio:e}}var nh,ms,OE,Cu,Ai,oh=w(()=>{"use strict";nh=E(require("lodash"));j();ms=E(require("jimp"));B();OE=x("image-capture-utils"),Cu=class extends Error{constructor(){super(...arguments);this.rectIsOutsideOfImageError=!0}};Ai=class{constructor(e,t,r){this.windowUtils=t;this.screenshotUtils=r}async takeViewPortImage(){let e=await this.screenshotUtils.takeScreenshot();return typeof e=="string"?e:e.image}takeImageForComparison(){return this.takeViewPortImage()}async takeAreaDataUrl(e){let t=await this.screenshotUtils.takeScreenshot(),r=await rh(e,t);return Object.assign(r,{screenImage:t.image,absoluteScreenHighlight:sh(e.elementRect,t.devicePixelRatio)})}async takeElementImage(e){let t=await this.screenshotUtils.takeElementScreenshot({ELEMENT:e});return{elementImage:typeof t=="string"?t:t.image}}async takeArea(e){let t=await this.screenshotUtils.takeScreenshot();return ME({screenImage:t.image,absoluteScreenHighlight:sh(e.elementRect,t.devicePixelRatio)})}forcePixelRatio(e){return this.screenshotUtils.forcePixelRatio(e)}getCurrentDevicePixelRatio(){return this.screenshotUtils.getCurrentDevicePixelRatio()}async takeStitchedDataUrl(e){let{windowUtils:t,screenshotUtils:r}=this,n=()=>oe(250),o=Boolean(e);async function i(p,g){o?await t.scrollToPositionWithoutAnimation(p):await t.scrollToPosition(p),await n();let f=await r.takeScreenshot(),h=await rh({elementRect:g},f);return{position:{left:p.x+g.left,top:p.y+g.top},size:{width:g.width,height:g.height},image:h.elementImage}}async function a(p){let g=[];for(let f of p){let h=await i(f.scrollPos,f.cropData);g.push(h)}return g}function c(p,g){let f=Math.max(p.width,g.width),h=g.width,y=Math.max(p.height,g.height),v=g.height,I=Array.from({length:Math.ceil(f/h)},(T,R)=>({scrollX:Math.min(R*h,f-h),cropX:R*h-Math.min(R*h,f-h),cropW:h-(R*h-Math.min(R*h,f-h))})),b=Array.from({length:Math.ceil(y/v)},(T,R)=>({scrollY:Math.min(R*v,y-v),cropY:R*v-Math.min(R*v,y-v),cropH:v-(R*v-Math.min(R*v,y-v))}));return I.flatMap(T=>b.map(R=>({scrollPos:{x:T.scrollX,y:R.scrollY},cropData:{top:R.cropY,left:T.cropX,width:T.cropW,height:R.cropH}})))}async function l(p,g){let f=await t.getCurrentScrollPosition(),h=c(p,g),y=await a(h);return await t.scrollToPosition(f),LE(p,y)}let[m,d]=await Promise.all([t.getFullPageSize(),t.getViewportSize()]);return await l(m,d)}}});var ih,ah,Pi,Ci,ch=w(()=>{"use strict";ih=E(require("p-retry")),ah=E(require("semver"));j();B();Ru();th();oh();be();Pi=x("tab-service"),Ci=class{constructor(e){this.driver=e;this.sessionTabs={};this._utils={};this.pendingTabs={};this.addedTabs={}}on(){}tabCount(e){if(this.sessionTabs[e])return this.sessionTabs[e].tabCount}getAllOpenTabIds(e){let t=this.getAllTabInfos(e);return Object.keys(t).filter(r=>!t[r].isClosed)}getActiveTabInfo(e){return this.sessionTabs[e].lastActiveTabInfo}getAllTabIds(e){return Object.keys(this.getAllTabInfos(e)).map(t=>t)}isSessionTab(e,t){return this.getAllTabIds(e).includes(t)}createSesion(e){this.sessionTabs[e]||(this.addedTabs[e]=new Set,this.sessionTabs[e]={pendingInfos:{},tabCount:0,tabInfos:{}})}setAddFrameHandlerCallBack(e){this.addFrameHandler=e}getAllTabInfoStrings(e){return this.getAllTabIds(e).map(r=>{let n=this.getTabInfo(e,r);return`tabId=${r}, url=${n.url}, order=${n.order}, isMain=${n.isMain}, openerStepId=${n.openerStepId}, isClosed=${n.isClosed}, currentUrl: ${n.currentUrl}, lastUpdatedUrl: ${n.lastUpdatedUrl}`})}getAllTabInfos(e){return this.sessionTabs[e].tabInfos}async addNewTab(e,t,r,n){if(!this.addedTabs[e].has(t))return this.addedTabs[e].add(t),Pi.info(`Adding a new tab sessionId: ${e}, tabId: ${t}, openerId: ${r}`),this.addTab(e,t,this.sessionTabs[e].tabCount++,r,n)}addOpenerStepId(e,t,r){this.sessionTabs[e].tabInfos[t].openerStepId=r}addOpenerStep(e,t,r){this.sessionTabs[e].tabInfos[t].openerStepId=r.id,this.sessionTabs[e].tabInfos[t].openerOriginalStepId=r.originalStepId}fixMissingMainTab(e){if(this.getMainTabInfo(e))return;let r=this.getAllTabInfos(e);Object.keys(r).length!==0&&(Object.values(this.getAllTabInfos(e))[0].isMain=!0)}async buildTabInfo(e,t,r,n,o={}){let i=await this.getTabDetails(t,e,o),a=te();function c(l){return o.checkForMainTab?i.isMainTab:!i.isMainTab||i.isMainTab==="unknown"?!l.getMainTabInfo(e):i.isMainTab}return this.sessionTabs[e].tabInfos[t]={infoId:a,url:i.url,title:i.title,favIconUrl:i.favIconUrl,order:r,from:this.getTabInfo(e,i.openerTabId),isMain:c(this),openerStepId:n},a}async addTab(e,t,r,n,o={}){let i=await this.buildTabInfo(e,t,r,n,o),a=new ps(t,this.driver);this._utils[i]={attachDebugger:()=>Promise.resolve(),detachDebugger:()=>Promise.resolve(),onDebuggerDetached:()=>{},tabId:t,domUtils:{getDOM:async()=>{}},windowUtils:a,imageCaptureUtils:new Ai(t,a,new xi(t,this.driver,{takeScreenshots:o.takeScreenshots}))}}getTabUtilsByTabIdAndSessionId(e,t){let r=this.sessionTabs[e].tabInfos[t];return this._utils[r.infoId]}getTabUtilsByTabId(e){let t=Object.keys(this._utils).find(r=>this._utils[r].tabId===e);return this._utils[t]}getTabInfo(e,t){return this.sessionTabs[e].tabInfos[t]}getTabUtils(e,t){if(!t)return this.getMainTabUtils(e);if(this._utils[t.infoId])return this._utils[t.infoId];if(t.isMain)return this.getMainTabUtils(e);let r=this.getAllTabInfos(e),n=Object.keys(r).map(i=>r[i]).filter(i=>!i.isMain);if(n.length===1)return this._utils[n[0].infoId];let o=Object.keys(e).map(i=>e[i]).filter(i=>this.isSameTab(e,t,i));return o.length>0?this._utils[o[0].infoId]:this.getMainTabUtils(e)}exactUrlMatch(e,t,r){let n=r.filter(o=>o===t.url);return!!((e.url===t.url||e.currentUrl===t.url||e.currentUrl&&e.currentUrl===t.currentUrl)&&n.length===1)}singleExactMatchForParts(e,t,r,n){let{urlUtils:o}=ee(),i=o.urlBreaker(e.url||e.currentUrl),a=o.urlBreaker(t.url||t.currentUrl),c=n(i),l=n(a),m=r.map(d=>o.urlBreaker(d)).map(d=>n(d)).filter(d=>d===c);return c===l&&m.length===1}isSameTab(e,t,r){let{tabMatcher:n}=ee();if(n){let l=this.getAllTabInfos(e),m=Object.keys(l).map(d=>l[d]);return n.isSameTab(m,t,r)}if(t.isMain&&r.isMain||t.openerStepId&&r.openerStepId&&t.openerStepId===r.openerStepId)return!0;let o=this.getAllTabInfos(e),i=Object.keys(o).map(l=>o[l].url);if(this.exactUrlMatch(t,r,i))return!0;let a=l=>`${l.domain}/${l.path.join("/")}`;if(this.singleExactMatchForParts(t,r,i,a))return!0;let c=l=>`${l.domain}/${l.path.join("/")}#${l.hash}`;return!!(this.singleExactMatchForParts(t,r,i,c)||t.order===r.order)}getMainTabInfo(e){let t=this.getAllTabInfos(e);return Object.keys(t).map(r=>t[r]).find(r=>r.isMain)}getMainTabUtils(e){let t=this.getMainTabInfo(e);return t?this.getTabUtils(e,t):{}}removeTabInfo(e,t){let n=this.getAllTabInfos(e)[t];delete this.sessionTabs[e].tabInfos[t],delete this._utils[n.infoId],this.sessionTabs[e].tabCount--}getMainTabId(e){let t=this.getAllTabInfos(e);return Object.keys(t).find(r=>t[r].isMain)}async isMainTabExists(e){let t=this.getMainTabId(e);return Boolean(t)}clearAllTabs(e){let t=this.getAllTabInfos(e);this.sessionTabs[e].tabCount=0,Object.keys(t).forEach(r=>this.removeTabInfo(e,r))}clearNonMainTabs(e){let t=this.getAllTabInfos(e);Object.keys(t).filter(r=>!t[r].isMain).forEach(r=>this.removeTabInfo(e,r)),this.sessionTabs[e].tabCount=1}async switchTab(e,t,{forceSwitch:r=!1}={}){let n=this.sessionTabs[t]?this.sessionTabs[t].tabCount:1;if(typeof n=="number"&&n>1||r)return this.driver.switchTab(e)}async getTabDetails(e,t,r={}){try{if(await this.switchTab(e,t,r),r.skipLoadInfo)return{title:"",url:""};let n=Promise.resolve("unknown");r.checkForMainTab&&(n=this.driver.executeJS("return window.__isMainTestimTab").then(o=>o.value));try{let[o,i,a]=await Promise.all([this.driver.getTitle(),this.driver.getUrl(),n]);return{title:o,url:i,isMainTab:a}}catch(o){Pi.error("failed to get url or title",{err:o})}}catch(n){Pi.error("failed to switch to tab",{tabId:e,err:n})}return{title:"",url:""}}async getUnregisteredTabId(e){return(await this.driver.getTabIds()).find(r=>!this.getAllTabIds(e).includes(r))}async waitForTabToOpen(e){let t=await this.getUnregisteredTabId(e);return t||(await oe(500),await this.waitForTabToOpen(e))}async tryToAddTab(e){if(this.pendingTabs[e])return;let t=await this.getUnregisteredTabId(e);t&&(await this.addNewTab(e,t),await this.addFrameHandler(t),Object.assign(this.sessionTabs[e],{currentTab:null}))}async addNewPopup(e,t){let r=this.getAllTabInfos(e);if(Object.keys(r).find(i=>r[i].openerStepId===t))return;if(this.pendingTabs[e]){Pi.info(`overriding opener step id from ${this.pendingTabs[e]} to ${t}`),this.pendingTabs[e]=t;return}this.pendingTabs[e]=t;let o=await this.waitForTabToOpen(e);await this.addNewTab(e,o,this.pendingTabs[e]),this.addFrameHandler(o),delete this.pendingTabs[e],Object.assign(this.sessionTabs[e],{currentTab:null})}async waitToPendingTabs(e,t){if(t)return(0,ih.default)(()=>{if(this.pendingTabs[e]===t)throw new Error("awaiting pending tabs")},{retries:5,factor:1,minTimeout:500,maxTimeout:500}).catch(()=>{})}async isMainTabIncognito(){return!1}isInvalidStepVersion(e){let t=ah.lt(e._version||e.version,"1.2.0"),r=!!e.parameterValues,n=r&&e.parameterValues.some(o=>o.type==="locate"&&!o.frameLocators);return t&&(!r||n)}async getTabIdByTabInfo(e,t){var a,c;let{tabMatcher:r,commonConstants:n}=ee();if(this.isInvalidStepVersion(t))throw Object.assign(new Error(""),{success:!1,shouldRetry:!1,errorType:n.stepResult.INVALID_TEST_VERSION});if((a=t.useCurrentTab)!=null&&a.call(t)){let l=await this.driver.getCurrentTabId();if(l)return l;let m=this.getMainTabId(e);if(m)return m;throw new Error("Current tab not found")}let o=(c=t.tabInfo)==null?void 0:c.openerStepId;await this.waitToPendingTabs(e,o);let i;if(r){let l=this.getAllTabIds(e).map(m=>Object.assign({},this.getTabInfo(e,m),{tabId:m})).filter(m=>!m.isClosed);i=r.matchTabs(t,l)}else{let l=t.tabInfo;l?i=this.getAllTabIds(e).find(m=>{let d=this.getTabInfo(e,m);return this.isSameTab(e,d,l)}):i=this.getMainTabId(e)}if(!i)throw await this.tryToAddTab(e),new Error("No tab ID found");if(this.sessionTabs[e].currentTab===i)return i;try{return await this.switchTab(i,e),Object.assign(this.sessionTabs[e],{currentTab:i}),i}catch(l){let m=["no such window","no window found","the window could not be found"];if(l.message&&m.some(d=>l.message.toLowerCase().includes(d)))return this.sessionTabs[e].tabCount--,this.sessionTabs[e].tabInfos[i].isClosed=!0,this.getTabIdByTabInfo(e,t);throw l}}}});var ku,ki,Ou=w(()=>{"use strict";ku=class{select(){return console.log(`
|
|
219
219
|
internal error - cant use port selector in selenium!!!!
|
|
220
|
-
`),Promise.reject({reason:"cant use port selector in selenium!"})}prepare(){}handleLegacyDataCaching(){}},ki=new ku});var fs,_u=w(()=>{"use strict";Au();be();fs=class{constructor(e,t){this.driver=e;this._abortedSteps=[];this.cookieUtils=t||new ds(this.driver)}get sessionPlayerInit(){return ee()}getTimeStamp(){return Date.now()}getTestimId(e){if(!e)return;let{locatorBuilderUtils:t}=this.sessionPlayerInit,r=t.TESTIM_ID_FIELD_NAME;return t.isEmptyResult(e)?t.EMPTY_RESULT_ID:e.getAttribute(r)}resetAbort(){this._abortedSteps.length=0}abort(e){this._abortedSteps.push(e)}get abortedSteps(){return this._abortedSteps}async restoreNativeAlerts(){}executeOverloadNativeAlertsInFrame(){}getClickOffset(e,t){let{utils:r,positionUtils:n}=this.sessionPlayerInit,o=n.calculateElementMiddlePoint(t);return e&&r.isWithinBounds(t.left,t.left+t.width,e.x)&&r.isWithinBounds(t.top,t.top+t.height,e.y)?{x:e.x-o.x,y:e.y-o.y}:{x:0,y:0}}async executeInAut(e,t){let{value:r}=await this.driver.executeJS(t);return r}extractTargetText(e){return this.driver.getTargetText(e)}extractText(e){return this.driver.getElementTextJS(e)}async markDynamicParent(e,t){await this.driver.markDynamicParent(e,t)}getCookie(e){return this.cookieUtils.get({name:e})}setCookie(e){return this.cookieUtils.set(e)}async getNextDynamicParent(e,t){let r
|
|
220
|
+
`),Promise.reject({reason:"cant use port selector in selenium!"})}prepare(){}handleLegacyDataCaching(){}},ki=new ku});var fs,_u=w(()=>{"use strict";Au();be();fs=class{constructor(e,t){this.driver=e;this._abortedSteps=[];this.cookieUtils=t||new ds(this.driver)}get sessionPlayerInit(){return ee()}getTimeStamp(){return Date.now()}getTestimId(e){if(!e)return;let{locatorBuilderUtils:t}=this.sessionPlayerInit,r=t.TESTIM_ID_FIELD_NAME;return t.isEmptyResult(e)?t.EMPTY_RESULT_ID:e.getAttribute(r)}resetAbort(){this._abortedSteps.length=0}abort(e){this._abortedSteps.push(e)}get abortedSteps(){return this._abortedSteps}async restoreNativeAlerts(){}executeOverloadNativeAlertsInFrame(){}getClickOffset(e,t){let{utils:r,positionUtils:n}=this.sessionPlayerInit,o=n.calculateElementMiddlePoint(t);return e&&r.isWithinBounds(t.left,t.left+t.width,e.x)&&r.isWithinBounds(t.top,t.top+t.height,e.y)?{x:e.x-o.x,y:e.y-o.y}:{x:0,y:0}}async executeInAut(e,t){let{value:r}=await this.driver.executeJS(t);return r}extractTargetText(e){return this.driver.getTargetText(e)}extractText(e){return this.driver.getElementTextJS(e)}async markDynamicParent(e,t){await this.driver.markDynamicParent(e,t)}getCookie(e){return this.cookieUtils.get({name:e})}setCookie(e){return this.cookieUtils.set(e)}async getNextDynamicParent(e,t){let r=this.sessionPlayerInit.codeSnippets.getNextDynamicParent(t),{value:n}=await this.driver.executeJS(`return (function() { ${r} })();`);return n}}});function uh(s){class e{constructor(r,n){this.frameManager=r;this.LocateElementPlayer=n;this._cache={}}cacheResults(r,n){this._cache[r]=n}getResultsFromCache(r){return this._cache[r]}cacheFrameLocateResults(r){if(r!=null&&r.seleniumFrameElement&&r.frameLocateResultUrl){let n=lh(r.seleniumFrameElement);n&&this.cacheResults(n,r.frameLocateResultUrl)}}async foundFrameCallback(r,n,o){let{frameOffset:i,locatedElement:a}=r,{locatorBuilderUtils:c}=ee();if(c.isEmptyResult(a)){let p="got empty result in frame result, not rejected from locate element player";throw NE.error(p),new Error(p)}let l=await s.switchToLocatedFrame(a),m=lh(l.value),d=this.getResultsFromCache(m);return{url:"",frameId:-1,frameOffset:i,tabInfo:n.tabInfo,tabId:n.tabId,testimFrameId:o,testimFullFrameId:`${this.currentFrameHandler.testimFullFrameId}-${o}`,seleniumFrameElement:l.value,frameLocateResultUrl:d}}async locate(r,n,o,i,a,c){let l=new this.LocateElementPlayer(i);r.targetId=`frameLocator_${n}`;let m=await l.locate(r,o,r.targetId);m.isVisible=!0;let d=await l.handleLocateResult(m,c,r).catch(()=>{throw new Error("")}),{locatedElement:p}=i.data[r.targetId],f=(await s.getElementLocationWithPadding(p)).value||{top:0,left:0};d.frameOffset={top:o.frameOffset.top+f.top,left:o.frameOffset.left+f.left},l.addFrameDataToContext&&l.addFrameDataToContext(d.targetId,d.locateResult);let h=await this.foundFrameCallback(d,a,r.testimFrameId);return this.currentFrameHandler=h,h}async findFrame(r,n,o,i){let a=M.flags.enableFrameSwitchOptimization.isEnabled(),l=o.playback.resultsHandler.resultsByChronologicOrder.at(-1),m=1,d=l&&l.stepId===r.id&&l.results.length>m;if(a&&!d&&this.currentFrameHandler){let y=n.findIndex(v=>v.testimFrameId===this.currentFrameHandler.testimFrameId);if(y>-1){let v=n.slice(y+1),I=0;for(let b of v)I++,this.currentFrameHandler=await this.locate(b,I,this.currentFrameHandler,o,i,r);return this.currentFrameHandler}}let p=await i.getTopFrameHandler();p.frameOffset={top:0,left:0},await(a&&this.currentFrameHandler===p?this.currentFrameHandler:s.switchToTopFrame()),this.cacheFrameLocateResults(this.currentFrameHandler),this.currentFrameHandler=p;let f=0,h=p;for(let y of n)f++,h=await this.locate(y,f,h,o,i,r);return h}}return e}var NE,UE,lh,ph=w(()=>{"use strict";B();Te();be();kr();NE=x("frame-locator"),UE="ELEMENT",lh=s=>s?s[UE]||s[Vt]:null});var Oi,Lu=w(()=>{"use strict";le();Oi=()=>{try{if(wp)return!1;if(require("inspector").url())return!0}catch{}return!1}});var W,ue=w(()=>{"use strict";be();W=class{constructor(e,t,r,n={},o=void 0,i=void 0,a={}){this.step=e;this.context=t;this.frameHandler=r;this.exportsGlobal=n;this.stepActionUtils=o;this.locateElementPlayer=i;this.exportsTest=a;this.frameId=0}get driver(){return this.stepActionUtils.driver}get sessionPlayerInit(){return ee()}async performAction(){throw new Error("not implemented")}getTarget(){let e=this.step.targetId||"targetId";return this.context.data[e]}async execute(){try{return{success:!0,...await this.performAction()}}catch(e){let t=e==null?void 0:e.message,r=e==null?void 0:e.displayMessage;return{success:!1,reason:t,exception:e,errorType:this.sessionPlayerInit.commonConstants.stepResult.ACTION_EXCEPTION,resultInfo:{exception:`selenium exception: ${t}`,error:r||t}}}}}});function BE(s,e,t,r){return s.opacity===0||s.isShadowed?!1:e===void 0||t===void 0?!0:M.flags.useClickimVisibilityChecks.isEnabled()?!1:r.isSafari()?M.flags.useSafariWebdriverVisibilityChecks.isEnabled():!0}function jE(s){return{getFrameIdByTestimFrameId(){},async setElementResultDataOnContext(e){let t=await s.getElement(e.locatedElement);e.seleniumElement=t.value},getElementRectangle(e){return s.getElementRect(e)},async getOffsets(e){return[e.frameOffset||{}]},htmlStringToDom(e,t){let n=new dh.DOMParser().parseFromString("<html><body></body></html>","text/html");return n.body.outerHTML=e,Object.assign(n,{TESTIM_URL:t,parsedUsingLinkedom:!0})},async isVisible(e,t,r,n,o,i,a){let{locatorBuilderUtils:c,codeSnippets:l,visibilityUtils:m,positionUtils:d}=ee();if(BE(n,m,d,s))return s.isVisible(e.seleniumElement);if(!e.seleniumElement)return{visible:!1,invisibleReason:"element not found"};try{await s.isVisible(e.seleniumElement)}catch{}if(!t||c.isEmptyResult(t))return{visible:!1,invisibleReason:"element not found"};let f=[d.calculateElementMiddlePoint(r),d.calculateClickPoint(n.clickOffset,r)].filter(Boolean),h=l.getVisibilityCode.getCompoundVisibilityInfoCode(e.locatedElement,f,!1,n),y;try{y=await s.execute(`return ${h}`)}catch(R){throw Pr.error("failed to execute getVisibilityCode",{err:R}),R}let{value:v}=y||{},I=v.elementVisibilityInfo||FE,[b,T]=v.elementsFromPointResults||[null,null];return m.checkElementVisibility(I,n,T,b,a,t,!1)},async scrollToElement(e,t){let{codeSnippets:{scrollToElement:r}}=ee();await s.execute(r(t))}}}var dh,Pr,FE,In,mh=w(()=>{"use strict";ue();B();Te();be();dh=require("linkedom"),Pr=x("locate-step-action"),FE={opacity:1,clientRects:{}};In=class extends W{execute(){return this.driver.getHTML(this.step)}static getUtils(e){return jE(e)}static getFrameIdByTestimFrameId(){throw Pr.warn("Unplanned access to getFrameIdByTestimFrameId()"),new Error("Use .getUtils() instead")}static setElementResultDataOnContext(){throw Pr.warn("Unplanned access to setElementResultDataOnContext()"),new Error("Use .getUtils() instead")}static getElementRectangle(){throw Pr.warn("Unplanned access to getElementRectangle()"),new Error("Use .getUtils() instead")}static getOffsets(){throw Pr.warn("Unplanned access to getOffsets()"),new Error("Use .getUtils() instead")}static htmlStringToDom(){throw Pr.warn("Unplanned access to htmlStringToDom()"),new Error("Use .getUtils() instead")}static isVisible(){throw Pr.warn("Unplanned access to isVisible()"),new Error("Use .getUtils() instead")}}});var fh={};V(fh,{scroll:()=>$E});var $E,gh=w(()=>{"use strict";$E=function(s,e,t,r,n,o,i,a){function c(I,b){if(!b)return{success:!1};elementScrollTo(b,I.x,I.y);let T=b.scrollLeft,R=b.scrollTop;return{success:Math.abs(R-I.y)<1&&Math.abs(T-I.x)<1,actualX:T,actualY:R}}function l(I,b){if(!t)return{x:n,y:o};let T=getLocatedElement(b);if(r&&!T)return{x:I.scrollWidth,y:I.scrollHeight};if(!T)throw new Error("could not find target element");let R=T.getBoundingClientRect(),C=0,k=0,S=Math.max(window.innerHeight-(R.height+10),0),U=Math.max(window.innerWidth-(R.width+10),0);return C=a?I.scrollTop+R.top-Math.min(o,S):I.scrollTop,k=i?I.scrollLeft+R.left-Math.min(n,U):I.scrollLeft,{x:Math.round(k),y:Math.round(C)}}let m=!s,d=m?document.scrollingElement||document.documentElement:getLocatedElement(s);if(!d)throw new Error("could not find target to scroll on");let p={top:d.scrollTop,left:d.scrollLeft},g=l(d,e),f=c(g,d);m&&!document.scrollingElement&&!f.success&&p.top===d.scrollTop&&p.left===d.scrollLeft&&(d=document.body,g=l(d,e),f=c(g,d));let h=f.actualX,y=f.actualY,v=getLocatedElement(e);if(t&&r&&!v)return{success:!1,expectedPosition:g};if(t){if(!v)throw new Error("could not find target to scroll to");let I=v.getBoundingClientRect();h=I.left,y=I.top}return{success:f.success,actualX:h,actualY:y}}});var _i,hh=w(()=>{"use strict";ue();_i=class extends W{getFailureString(e,t,r,n,o){if(!e.isScrollToElement)return`Scrolling limit reached. Expected:(y: ${r}, x: ${t}); Actual:(y:${o}, x: ${n})`;let i="Scrolling limit reached";return e.shouldScrollTop&&(i+=`. Expected top margin: ${r}, actual: ${o}`),e.shouldScrollLeft&&(i+=`. Expected left margin: ${t}, actual: ${n}`),i}async scroll(e,t,r){let{codeSnippets:n,commonConstants:{stepResult:o}}=this.sessionPlayerInit,i=Math.round(Number(t.isScrollToElement?t.marginTop:t.y)),a=Math.round(Number(t.isScrollToElement?t.marginLeft:t.x)),c=this.driver.isFirefox()?function(d,p,g){d.scrollTo(p,g)}:function(d,p,g){d.scrollTop=g,d.scrollLeft=p},{scroll:l}=await Promise.resolve().then(()=>(gh(),fh)),m=`
|
|
221
221
|
const getLocatedElement = ${n.getLocatedElementCode};
|
|
222
222
|
const elementScrollTo = ${c.toString()};
|
|
223
223
|
const scroll = ${l.toString()};
|