@testim/testim-cli 4.1.0 → 4.2.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 CHANGED
@@ -366,7 +366,7 @@ ${((A=n.warnings)==null?void 0:A.join(`
366
366
  injectCode(params, args, incomingParams, context, code);
367
367
  });
368
368
  })();
369
- `,g=[],h=new a(f,{eval:!0});return te(new Promise(y=>{h.on("message",w=>{if(w.action==="finish"){let{data:A}=w,b=Object.assign({},A,{tstConsoleLogs:g});Ue.debug("Run code worker response",{messageWithLogs:b,transactionId:r}),y(b)}else w.action==="progress"&&g.push(w.data)}).on("error",w=>{w.message==="malformed data: URI"?Ue.error("Run code worker error",{err:w,transactionId:r,fileDataUrl:i}):Ue.error("Run code worker error",{err:w,transactionId:r}),y({tstConsoleLogs:g,status:"failed",result:{resultValue:w==null?void 0:w.toString(),exports:{},exportsTest:{},exportsGlobal:{}},success:!1})}).on("exit",()=>{Ue.debug("Run code worker has been terminated",{transactionId:r})}),h.postMessage({incomingParams:e,context:JSON.parse(JSON.stringify(t)),code:s})}),o).catch(y=>{if(!(y instanceof J))throw y;return Ue.warn("timeout to run code",{transactionId:r,err:y}),{tstConsoleLogs:g,status:"failed",result:{resultValue:y==null?void 0:y.toString(),exports:{},exportsTest:{},exportsGlobal:{}},success:!1}}).finally(()=>h==null?void 0:h.terminate())}async function wE(r){try{await Eu.promises.rm(r,{recursive:!0,force:!0})}catch(e){Ue.warn("failed to remove install npm packages folder",{err:e})}}function Ig(r,e,t,s){return`${e}_${t}_${r}_${s}`}async function Es(r,e,t,s,n,o){let i=Ig(n,e,r,t),{data:a}=await TE(i,s,o);return a}async function Ss(r,e,t,s,n,o,i,a,c,l){var g;let d=Object.fromEntries(((g=t.nodePackageParams)==null?void 0:g.map(h=>[h.paramName,h.testimPackageLocalLocation]))||[]),m=Ig(i,n,e,o);if(l){let h=await mn(l);h&&(c=h)}if(typeof Mr>"u")try{Mr=require("worker_threads")}catch{Mr=!1}Buffer.isBuffer(c)&&(Ue.debug("runCodeWithPackages: converted a buffer to base 64 string data URI",{fileDataUrl:c}),c=c.toString());let p="data:,";if(c==="data:"&&(Ue.debug("runCodeWithPackages, fileDataUrl was an empty string ",{fileDataUrl:c}),c=p),Mr&&M.flags.enableWorkerThreadsCliCodeExecution.isEnabled()){let h=await bE(m,t,s,r,d,a,c);return Object.assign({},h,{nodeVersion:process.version})}let f=await hE(m,t,s,r,d,a,c);return Object.assign({},f,{nodeVersion:process.version})}async function TE(r,e,t){let s=e.map(c=>`${c.packageName}@${c.packageVersion}`),n=xg(),o=vs.join(n,`/${r}`),i=global.proxyUri;async function a(){let c="";try{if(c=await Bp(o,s,i,t),Ue.info("npm package install finished",{transactionId:r,output:c,timeout:t}),Number(c.trim().split(" ")[1])<s.length)throw"npm package install failed, couldn't install all packages";return{data:e.map(d=>{let m=jp(o,d.packageName),p=`${d.packageName}@${m}`,f=vs.resolve(o,"node_modules",d.packageName);return Object.assign({},d,{packageFullName:p,packageLocalLocation:f})}),installFolder:o}}catch(l){throw Ue.warn("npm package install failed",{transactionId:r,err:l}),l}}try{return await te(a(),t)}catch(c){throw c instanceof J&&Ue.warn("timeout to install package",{packages:s,transactionId:r,err:c,timeout:t}),c}}function xg(){return vs.join(Sg.tmpdir(),"/testim_local_packages")}function Pg(){let r=xg();return wE(r)}var Eu,Sg,vs,Su,Pi,Ue,Mr,Fr=T(()=>{"use strict";Eu=E(require("fs")),Sg=E(require("os")),vs=E(require("path"));U();on();Su=E(require("data-uri-to-buffer")),Pi=require("threads");q();j();Te();ye();Ue=R("cli-service");Pi.config.set({basepath:{node:__dirname}})});var or={};W(or,{run:()=>EE});function vE(r,e){try{let t=e.defaults.enforceMaximumJsResultSize,s=M.flags.maximumJsResultSize.getValue(),n=JSON.stringify(r).length>s;return t?n:!1}catch{return!1}}var EE,Ag=T(()=>{"use strict";Fr();q();ye();EE=async(r,e,t)=>{let{code:s,stepId:n,incomingParams:o,context:i,testResultId:a,retryIndex:c,stepResultId:l,runTimeout:d,fileDataUrl:m,s3filepath:p}=e.data;try{let f=await Ss(s,n,o,i,a,c,l,d,m,p);return f&&vE({result:f.result,tstConsoleLogs:f.tstConsoleLogs},t)?{code:"js-result-max-size-exceeded",success:!1}:{data:f,success:!0}}catch(f){throw f instanceof J?new Error("Timeout while running action"):f}}});var Ru,Is,Iu=T(()=>{"use strict";j();Ru=R("cookies-utils"),Is=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(s){throw Ru.error("failed to set cookie",{err:s}),s}}async get(e){try{return await this.driver.getCookie(e.name)}catch(t){throw Ru.error("failed to get cookie",{err:t}),t}}async remove(e){try{return await this.driver.deleteCookie(e.name)}catch(t){throw Ru.error("failed to remove cookie",{err:t}),t}}}});var xu,SE,xs,Pu=T(()=>{"use strict";U();xu=E(require("p-retry"));U();j();q();SE=R("window-utils"),xs=class{constructor(e,t){this.id=e,this.driver=t}getElementFromPoint(e,t){function s(n,o){var i=document.elementFromPoint(n,o);return{testimId:i?i.getAttribute("testim_dom_element_id"):null,tagName:i?i.tagName:null}}return this.driver.executeJS(s,e,t).then(n=>n.value)}getLocation(){return this.driver.getUrl()}stopListeningToScroll(){return Promise.resolve()}resumeListeningToScroll(){return Promise.resolve()}scrollToPosition(e){return this.driver.scroll(e.x,e.y)}scrollToPositionWithoutAnimation(e){function t(s){var n="scrollBehavior"in document.documentElement.style;return n?window.scrollTo({left:s.x,top:s.y,behavior:"instant"}):window.scrollTo(s.x,s.y)}return this.driver.executeJS(t,e)}getCurrentScrollPosition(){function e(){return{x:window.scrollX,y:window.scrollY}}return this.driver.executeJS(e).then(t=>t.value)}navigate(e,t=15e3){let s=this;async function n(o=3){try{await s.driver.url(e)}catch(i){if(i.seleniumStack&&i.message.includes("method IWebBrowser2::Navigate2() failed")&&o>0)return SE.warn("selenium navigation failed. retrying to navigate",{err:i}),await se(1500),n(o-1);throw i}}return Promise.race([n(),se(t)])}reloadTab(e=15e3){return Promise.race([this.driver.reloadTab(),se(e)])}getViewportSize(){return this.driver.getViewportSize()}maximizeWithoutValidation(){return this.driver.maximizeWithoutValidation()}getFullPageSize(){function e(){var t=document.body,s=document.documentElement,n=Math.max(t.scrollHeight,t.offsetHeight,s.clientHeight,s.scrollHeight,s.offsetHeight),o=Math.max(t.scrollWidth,t.offsetWidth,s.clientWidth,s.scrollWidth,s.offsetWidth);return{height:n,width:o}}return this.driver.executeJS(e).then(t=>t.value)}extractToNewWindow(){return Promise.resolve()}async checkSize(e){await se(1e3);let t=await this.getViewportSize();return t.width!==e.width||t.height!==e.height?Promise.reject({actualSize:t,expectedSize:e}):{actualSize:t,expectedSize:e}}async setViewportSize(e){return await this.driver.setViewportSize(e.width,e.height),await this.checkSize(e)}async validatePageIsAvailable(){function e(){var s;if(typeof location<"u")s=location;else if(typeof window<"u"&&typeof window.location<"u")s=window.location;else return!1;return s.href!=="chrome-error://chromewebdata/"&&s.href!=="safari-resource:/ErrorPage.html"&&s.href.indexOf("res://ieframe.dll/http_404.htm")!==0&&s.href.indexOf("ms-appx-web://microsoft.microsoftedge/assets/errorpages/")!==0}if(!(await this.driver.executeJS(e)).value)throw new lt("validatePageIsAvailable:PageNotAvailableError")}focusTab(){return this.driver.switchTab(this.id)}quit(){}async getOsAndBrowser(){let e=await(0,xu.default)(()=>this.driver.getBrowserAndOS(),{retries:3});return{uaBrowserName:e.browser,uaOs:e.os,userAgent:e.userAgent,browserVersion:e.browserVersion}}getUserAgentInfo(){return(0,xu.default)(()=>this.driver.getUserAgentInfo(),{retries:3})}}});var Au,Ai,Cg=T(()=>{"use strict";Au=E(require("p-retry")),Ai=class{constructor(e,t,s={takeScreenshots:!0}){this.tabId=e,this.driver=t,this.options=s}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,s=this.currentDevicePixelRatio?Promise.resolve(this.currentDevicePixelRatio):this.getDevicePixelRatio(),n=()=>Promise.all([s,this.driver.takeScreenshot()]),[o,i]=await(0,Au.default)(n,{retries:e,minTimeout:t}),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,s=2e3,n=this.currentDevicePixelRatio?Promise.resolve(this.currentDevicePixelRatio):this.getDevicePixelRatio(),o=()=>Promise.all([n,this.driver.takeElementScreenshot(e)]),[i,a]=await(0,Au.default)(o,{retries:t,minTimeout:s}),c=a?a.value:"";return{image:`data:image/png;base64,${this.base64AddPadding(c.replace(/[\r\n]/g,""))}`,devicePixelRatio:i}}getDevicePixelRatio(){function e(){try{return window.devicePixelRatio}catch{return 1}}return this.driver.executeJS(e).then(t=>t.value)}forcePixelRatio(e=1){return this.currentDevicePixelRatio=e,Promise.resolve()}getCurrentDevicePixelRatio(){return this.currentDevicePixelRatio}}});async function kg(r,e){let t=e.image||e,s=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=r.offset||{top:0,left:0};if(o.top*=s,o.left*=s,!r.elementRect)return RE.warn("missing elementRect",Og.omit(r,"image")),{};let{elementRect:i}=r,a=await Ps.default.read(Buffer.from(n[1],"base64")),c=i.left*s+o.left*s,l=i.top*s+o.top*s,d=i.width*s,m=i.height*s;c<0&&(d+=c,d=d<0?0:d,c=0),l<0&&(m+=l,m=m<0?0:m,l=0);let p=a.bitmap.width,f=a.bitmap.height;if(c+d>p&&(d=p-c),l+m>f&&(m=f-l),m<=0||d<=0)throw new _n("height or width is equal or lower than zero");return{elementImage:await a.crop(c,l,d,m).getBase64Async(Ps.default.MIME_PNG)}}async function IE(r,e){let t=await Ps.default.read(r.width,r.height);for(let n of e){let o=n.image.match(/^data\:[^;]*\;base64,(.*)$/),i=await Ps.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(Ps.default.MIME_PNG)}function xE(r,e){return IE(r,e)}function PE(){return Promise.resolve()}function AE(r){function e(s){return typeof r[s]=="string"&&r[s].startsWith("data")}function t(s){return PE(r[s]).then(n=>({key:s,url:n}))}return Promise.all(Object.keys(r).filter(e).map(t)).then(s=>s.reduce((n,o)=>(n[o.key]=o.url,n),r))}function _g(r,e){return e=e||1,r=r||{left:0,top:0,width:0,height:0},{left:e*Math.round(r.left),top:e*Math.round(r.top),width:e*Math.round(r.width),height:e*Math.round(r.height),pixelRatio:e}}var Og,Ps,RE,_n,Ci,Lg=T(()=>{"use strict";Og=E(require("lodash"));U();Ps=E(require("jimp"));j();RE=R("image-capture-utils"),_n=class extends Error{constructor(e){super(e),this.rectIsOutsideOfImageError=!0,Object.setPrototypeOf(this,_n.prototype)}};Ci=class{constructor(e,t,s){this.windowUtils=t,this.screenshotUtils=s}async takeViewPortImage(){let e=await this.screenshotUtils.takeScreenshot();return typeof e=="string"?e:e.image}takeImageForComparison(){return this.takeViewPortImage()}async takeAreaDataUrl(e){e.areas&&(e=e.areas);let t=await this.screenshotUtils.takeScreenshot(),s=await kg(e,t);return s.screenImage=t.image,s.absoluteScreenHighlight=_g(e.elementRect,t.devicePixelRatio),s}async takeElementImage(e){let t=await this.screenshotUtils.takeElementScreenshot({ELEMENT:e});return typeof t=="string"?t:t.image}async takeArea(e){e.areas&&(e=e.areas);let t=await this.screenshotUtils.takeScreenshot();return AE({screenImage:t.image,absoluteScreenHighlight:_g(e.elementRect,t.devicePixelRatio)})}forcePixelRatio(e){return this.screenshotUtils.forcePixelRatio(e)}getCurrentDevicePixelRatio(){return this.screenshotUtils.getCurrentDevicePixelRatio()}async takeStitchedDataUrl(e){let{windowUtils:t,screenshotUtils:s}=this,n=()=>se(250),o=Boolean(e);async function i(p,f){o?await t.scrollToPositionWithoutAnimation(p):await t.scrollToPosition(p),await n();let g=await s.takeScreenshot(),h=await kg({elementRect:f},g);return{position:{left:p.x+f.left,top:p.y+f.top},size:{width:f.width,height:f.height},image:h.elementImage}}async function a(p){let f=[];for(let g of p){let h=await i(g.scrollPos,g.cropData);f.push(h)}return f}function c(p,f){let g=Math.max(p.width,f.width),h=f.width,y=Math.max(p.height,f.height),w=f.height,A=Array.from({length:Math.ceil(g/h)},(v,x)=>({scrollX:Math.min(x*h,g-h),cropX:x*h-Math.min(x*h,g-h),cropW:h-(x*h-Math.min(x*h,g-h))})),b=Array.from({length:Math.ceil(y/w)},(v,x)=>({scrollY:Math.min(x*w,y-w),cropY:x*w-Math.min(x*w,y-w),cropH:w-(x*w-Math.min(x*w,y-w))}));return A.flatMap(v=>b.map(x=>({scrollPos:{x:v.scrollX,y:x.scrollY},cropData:{top:x.cropY,left:v.cropX,width:v.cropW,height:x.cropH}})))}async function l(p,f){let g=await t.getCurrentScrollPosition(),h=c(p,f),y=await a(h);return await t.scrollToPosition(g),xE(p,y)}let[d,m]=await Promise.all([t.getFullPageSize(),t.getViewportSize()]);return await l(d,m)}}});var Ng,ki,_i,Dg=T(()=>{"use strict";Ng=E(require("semver"));U();j();Pu();Cg();Lg();Ee();ki=R("tab-service"),_i=class{constructor(e){this.driver=e,this._utils={},this.sessionTabs={},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(s=>!t[s].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]={tabCount:0,tabInfos:{}})}setAddFrameHandlerCallBack(e){this.addFrameHandler=e}getAllTabInfoStrings(e){return this.getAllTabIds(e).map(s=>{let n=this.getTabInfo(e,s);return`tabId=${s}, 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}addNewTab(e,t,s,n={}){return this.addedTabs[e].has(t)?Promise.resolve():(this.addedTabs[e].add(t),ki.info(`Adding a new tab sessionId: ${e}, tabId: ${t}, openerId: ${s}`),this.addTab(e,t,this.sessionTabs[e].tabCount++,s,n))}addOpenerStepId(e,t,s){this.sessionTabs[e].tabInfos[t].openerStepId=s}addOpenerStep(e,t,s){this.sessionTabs[e].tabInfos[t].openerStepId=s.id,this.sessionTabs[e].tabInfos[t].openerOriginalStepId=s.originalStepId}fixMissingMainTab(e){if(this.getMainTabInfo(e))return;let s=this.getAllTabInfos(e);Object.keys(s).length!==0&&(Object.values(this.getAllTabInfos(e))[0].isMain=!0)}async buildTabInfo(e,t,s,n,o={}){let i=await this.getTabDetails(t,e,o),a=z();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:s,from:this.getTabInfo(e,i.openerTabId),isMain:c(this),openerStepId:n},a}async addTab(e,t,s,n,o={}){let i=await this.buildTabInfo(e,t,s,n,o),a=new xs(t,this.driver);this._utils[i]={attachDebugger:()=>Promise.resolve(),detachDebugger:()=>Promise.resolve(),onDebuggerDetached:()=>{},tabId:t,domUtils:{getDOM:()=>Promise.resolve()},windowUtils:a,imageCaptureUtils:new Ci(t,a,new Ai(t,this.driver,{takeScreenshots:o.takeScreenshots}))}}getTabUtilsByTabIdAndSessionId(e,t){let s=this.sessionTabs[e].tabInfos[t];return this._utils[s.infoId]}getTabUtilsByTabId(e){let t=Object.keys(this._utils).find(s=>this._utils[s].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 s=this.getAllTabInfos(e),n=Object.keys(s).map(i=>s[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,s){let n=s.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,s,n){let{urlUtils:o}=re(),i=o.urlBreaker(e.url||e.currentUrl),a=o.urlBreaker(t.url||t.currentUrl),c=n(i),l=n(a),d=s.map(m=>o.urlBreaker(m)).map(m=>n(m)).filter(m=>m===c);return c===l&&d.length===1}isSameTab(e,t,s){let{tabMatcher:n}=re();if(n){let l=this.getAllTabInfos(e),d=Object.keys(l).map(m=>l[m]);return n.isSameTab(d,t,s)}if(t.isMain&&s.isMain||t.openerStepId&&s.openerStepId&&t.openerStepId===s.openerStepId)return!0;let o=this.getAllTabInfos(e),i=Object.keys(o).map(l=>o[l].url);if(this.exactUrlMatch(t,s,i))return!0;let a=l=>`${l.domain}/${l.path.join("/")}`;if(this.singleExactMatchForParts(t,s,i,a))return!0;let c=l=>`${l.domain}/${l.path.join("/")}#${l.hash}`;return!!(this.singleExactMatchForParts(t,s,i,c)||t.order===s.order)}getMainTabInfo(e){let t=this.getAllTabInfos(e);return Object.keys(t).map(s=>t[s]).find(s=>s.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(s=>t[s].isMain)}isMainTabExists(e){return this.getMainTabId(e)?Promise.resolve(!0):Promise.resolve(!1)}clearAllTabs(e){let t=this.getAllTabInfos(e);this.sessionTabs[e].tabCount=0,Object.keys(t).forEach(s=>this.removeTabInfo(e,s))}clearNonMainTabs(e){let t=this.getAllTabInfos(e);Object.keys(t).filter(s=>!t[s].isMain).forEach(s=>this.removeTabInfo(e,s)),this.sessionTabs[e].tabCount=1}switchTab(e,t,{forceSwitch:s=!1}={}){let n=this.sessionTabs[t]?this.sessionTabs[t].tabCount:1;return typeof n=="number"&&n>1||s?this.driver.switchTab(e):Promise.resolve()}getTabDetails(e,t,s={}){return this.switchTab(e,t,s).then(()=>{if(s.skipLoadInfo)return{title:"",url:""};let n=Promise.resolve("unknown");return s.checkForMainTab&&(n=this.driver.executeJS("return window.__isMainTestimTab").then(o=>o.value)),Promise.all([this.driver.getTitle(),this.driver.getUrl(),n]).then(([o,i,a])=>({title:o,url:i,isMainTab:a}),o=>(ki.error("failed to get url or title",{err:o}),{title:"",url:""}))}).catch(n=>{ki.error("failed to switch to tab",{tabId:e,err:n})})}async getUnregisteredTabId(e){return(await this.driver.getTabIds()).find(s=>!this.getAllTabIds(e).includes(s))}async waitForTabToOpen(e){let t=await this.getUnregisteredTabId(e);return t||(await se(500),await this.waitForTabToOpen(e))}async tryToAddTab(e,t){if(this.pendingTabs[e])return;let s=await this.getUnregisteredTabId(e);s&&(await this.addNewTab(e,s),await this.addFrameHandler(s),this.sessionTabs[e].currentTab=null)}addNewPopup(e,t){let s=this.getAllTabInfos(e);return Object.keys(s).find(o=>s[o].openerStepId===t)?Promise.resolve():this.pendingTabs[e]?(ki.info(`overriding opener step id from ${this.pendingTabs[e]} to ${t}`),this.pendingTabs[e]=t,Promise.resolve()):(this.pendingTabs[e]=t,this.waitForTabToOpen(e).then(o=>this.addNewTab(e,o,this.pendingTabs[e]).then(()=>this.addFrameHandler(o)).then(()=>delete this.pendingTabs[e]).then(()=>this.sessionTabs[e].currentTab=null)))}waitToPendingTabs(e,t){let n=3e3,o=this;return t?new Promise(i=>{function a(){o.pendingTabs[e]===t&&n-500>0?(n-=500,setTimeout(a,500)):i()}a()}):Promise.resolve()}isMainTabIncognito(){return Promise.resolve(!1)}isInvalidStepVersion(e){let t=Ng.lt(e._version||e.version,"1.2.0"),s=!!e.parameterValues,n=s&&e.parameterValues.some(o=>o.type==="locate"&&!o.frameLocators);return t&&(!s||n)}getTabIdByTabInfo(e,t){var i,a;let{tabMatcher:s,commonConstants:n}=re();if(this.isInvalidStepVersion(t))return Promise.reject({success:!1,shouldRetry:!1,errorType:n.stepResult.INVALID_TEST_VERSION});if((i=t.useCurrentTab)!=null&&i.call(t))return this.driver.getCurrentTabId().then(c=>{if(c)return c;let l=this.getMainTabId(e);if(l)return l;throw new Error("Current tab not found")});let o=(a=t.tabInfo)==null?void 0:a.openerStepId;return this.waitToPendingTabs(e,o).then(()=>{let c;if(s){let l=this.getAllTabIds(e).map(d=>Object.assign({},this.getTabInfo(e,d),{tabId:d})).filter(d=>!d.isClosed);c=s.matchTabs(t,l)}else{let l=t.tabInfo;l?c=this.getAllTabIds(e).find(d=>{let m=this.getTabInfo(e,d);return this.isSameTab(e,m,l)}):c=this.getMainTabId(e)}return c?this.sessionTabs[e].currentTab===c?c:this.switchTab(c,e).then(()=>(this.sessionTabs[e].currentTab=c,c)).catch(l=>{let d=["no such window","no window found","the window could not be found"];if(l.message&&d.some(m=>l.message.toLowerCase().includes(m)))return this.sessionTabs[e].tabCount--,this.sessionTabs[e].tabInfos[c].isClosed=!0,this.getTabIdByTabInfo(e,t);throw l}):this.tryToAddTab(e,o).then(()=>{throw new Error("No tab ID found")})})}}});var Cu,Oi,ku=T(()=>{"use strict";Cu=class{constructor(){}select(){return console.log(`
369
+ `,g=[],h=new a(f,{eval:!0});return te(new Promise(y=>{h.on("message",w=>{if(w.action==="finish"){let{data:A}=w,b=Object.assign({},A,{tstConsoleLogs:g});Ue.debug("Run code worker response",{messageWithLogs:b,transactionId:r}),y(b)}else w.action==="progress"&&g.push(w.data)}).on("error",w=>{w.message==="malformed data: URI"?Ue.error("Run code worker error",{err:w,transactionId:r,fileDataUrl:i}):Ue.error("Run code worker error",{err:w,transactionId:r}),y({tstConsoleLogs:g,status:"failed",result:{resultValue:w==null?void 0:w.toString(),exports:{},exportsTest:{},exportsGlobal:{}},success:!1})}).on("exit",()=>{Ue.debug("Run code worker has been terminated",{transactionId:r})}),h.postMessage({incomingParams:e,context:JSON.parse(JSON.stringify(t)),code:s})}),o).catch(y=>{if(!(y instanceof J))throw y;return Ue.warn("timeout to run code",{transactionId:r,err:y}),{tstConsoleLogs:g,status:"failed",result:{resultValue:y==null?void 0:y.toString(),exports:{},exportsTest:{},exportsGlobal:{}},success:!1}}).finally(()=>h==null?void 0:h.terminate())}async function wE(r){try{await Eu.promises.rm(r,{recursive:!0,force:!0})}catch(e){Ue.warn("failed to remove install npm packages folder",{err:e})}}function Ig(r,e,t,s){return`${e}_${t}_${r}_${s}`}async function Es(r,e,t,s,n,o){let i=Ig(n,e,r,t),{data:a}=await TE(i,s,o);return a}async function Ss(r,e,t,s,n,o,i,a,c,l){var g;let d=Object.fromEntries(((g=t.nodePackageParams)==null?void 0:g.map(h=>[h.paramName,h.testimPackageLocalLocation]))||[]),m=Ig(i,n,e,o);if(l){let h=await mn(l);h&&(c=h)}if(typeof Mr>"u")try{Mr=require("worker_threads")}catch{Mr=!1}Buffer.isBuffer(c)&&(Ue.debug("runCodeWithPackages: converted a buffer to base 64 string data URI",{fileDataUrl:c}),c=c.toString());let p="data:,";if(c==="data:"&&(Ue.debug("runCodeWithPackages, fileDataUrl was an empty string ",{fileDataUrl:c}),c=p),Mr&&M.flags.enableWorkerThreadsCliCodeExecution.isEnabled()){let h=await bE(m,t,s,r,d,a,c);return Object.assign({},h,{nodeVersion:process.version})}let f=await hE(m,t,s,r,d,a,c);return Object.assign({},f,{nodeVersion:process.version})}async function TE(r,e,t){let s=e.map(c=>`${c.packageName}@${c.packageVersion}`),n=xg(),o=vs.join(n,`/${r}`),i=global.proxyUri;async function a(){let c="";try{if(c=await Bp(o,s,i,t),Ue.info("npm package install finished",{transactionId:r,output:c,timeout:t}),Number(c.trim().split(" ")[1])<s.length)throw"npm package install failed, couldn't install all packages";return{data:e.map(d=>{let m=jp(o,d.packageName),p=`${d.packageName}@${m}`,f=vs.resolve(o,"node_modules",d.packageName);return Object.assign({},d,{packageFullName:p,packageLocalLocation:f})}),installFolder:o}}catch(l){throw Ue.warn("npm package install failed",{transactionId:r,err:l}),l}}try{return await te(a(),t)}catch(c){throw c instanceof J&&Ue.warn("timeout to install package",{packages:s,transactionId:r,err:c,timeout:t}),c}}function xg(){return vs.join(Sg.tmpdir(),"/testim_local_packages")}function Pg(){let r=xg();return wE(r)}var Eu,Sg,vs,Su,Pi,Ue,Mr,Fr=T(()=>{"use strict";Eu=E(require("fs")),Sg=E(require("os")),vs=E(require("path"));U();on();Su=E(require("data-uri-to-buffer")),Pi=require("threads");q();j();Te();ye();Ue=R("cli-service");Pi.config.set({basepath:{node:__dirname}})});var or={};W(or,{run:()=>EE});function vE(r,e){try{let t=e.defaults.enforceMaximumJsResultSize,s=M.flags.maximumJsResultSize.getValue(),n=JSON.stringify(r).length>s;return t?n:!1}catch{return!1}}var EE,Ag=T(()=>{"use strict";Fr();q();ye();EE=async(r,e,t)=>{let{code:s,stepId:n,incomingParams:o,context:i,testResultId:a,retryIndex:c,stepResultId:l,runTimeout:d,fileDataUrl:m,s3filepath:p}=e.data;try{let f=await Ss(s,n,o,i,a,c,l,d,m,p);return f&&vE({result:f.result,tstConsoleLogs:f.tstConsoleLogs},t)?{code:"js-result-max-size-exceeded",success:!1}:{data:f,success:!0}}catch(f){throw f instanceof J?new Error("Timeout while running action"):f}}});var Ru,Is,Iu=T(()=>{"use strict";j();Ru=R("cookies-utils"),Is=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(s){throw Ru.error("failed to set cookie",{err:s}),s}}async get(e){try{return await this.driver.getCookie(e.name)}catch(t){throw Ru.error("failed to get cookie",{err:t}),t}}async remove(e){try{return await this.driver.deleteCookie(e.name)}catch(t){throw Ru.error("failed to remove cookie",{err:t}),t}}}});var xu,SE,xs,Pu=T(()=>{"use strict";U();xu=E(require("p-retry"));U();j();q();SE=R("window-utils"),xs=class{constructor(e,t){this.id=e,this.driver=t}getElementFromPoint(e,t){function s(n,o){var i=document.elementFromPoint(n,o);return{testimId:i?i.getAttribute("testim_dom_element_id"):null,tagName:i?i.tagName:null}}return this.driver.executeJS(s,e,t).then(n=>n.value)}getLocation(){return this.driver.getUrl()}stopListeningToScroll(){return Promise.resolve()}resumeListeningToScroll(){return Promise.resolve()}scrollToPosition(e){return this.driver.scroll(e.x,e.y)}scrollToPositionWithoutAnimation(e){function t(s){var n="scrollBehavior"in document.documentElement.style;return n?window.scrollTo({left:s.x,top:s.y,behavior:"instant"}):window.scrollTo(s.x,s.y)}return this.driver.executeJS(t,e)}getCurrentScrollPosition(){function e(){return{x:window.scrollX,y:window.scrollY}}return this.driver.executeJS(e).then(t=>t.value)}navigate(e,t=15e3){let s=this;async function n(o=3){try{await s.driver.url(e)}catch(i){if(i.seleniumStack&&i.message.includes("method IWebBrowser2::Navigate2() failed")&&o>0)return SE.warn("selenium navigation failed. retrying to navigate",{err:i}),await se(1500),n(o-1);throw i}}return Promise.race([n(),se(t)])}reloadTab(e=15e3){return Promise.race([this.driver.reloadTab(),se(e)])}getViewportSize(){return this.driver.getViewportSize()}maximizeWithoutValidation(){return this.driver.maximizeWithoutValidation()}getFullPageSize(){function e(){var t=document.body,s=document.documentElement,n=Math.max(t.scrollHeight,t.offsetHeight,s.clientHeight,s.scrollHeight,s.offsetHeight),o=Math.max(t.scrollWidth,t.offsetWidth,s.clientWidth,s.scrollWidth,s.offsetWidth);return{height:n,width:o}}return this.driver.executeJS(e).then(t=>t.value)}extractToNewWindow(){return Promise.resolve()}async checkSize(e){await se(1e3);let t=await this.getViewportSize();return t.width!==e.width||t.height!==e.height?Promise.reject({actualSize:t,expectedSize:e}):{actualSize:t,expectedSize:e}}async setViewportSize(e){return await this.driver.setViewportSize(e.width,e.height),await this.checkSize(e)}async validatePageIsAvailable(){function e(){var s;if(typeof location<"u")s=location;else if(typeof window<"u"&&typeof window.location<"u")s=window.location;else return!1;return s.href!=="chrome-error://chromewebdata/"&&s.href!=="safari-resource:/ErrorPage.html"&&s.href.indexOf("res://ieframe.dll/http_404.htm")!==0&&s.href.indexOf("ms-appx-web://microsoft.microsoftedge/assets/errorpages/")!==0}if(!(await this.driver.executeJS(e)).value)throw new lt("validatePageIsAvailable:PageNotAvailableError")}focusTab(){return this.driver.switchTab(this.id)}quit(){}async getOsAndBrowser(){let e=await(0,xu.default)(()=>this.driver.getBrowserAndOS(),{retries:3});return{uaBrowserName:e.browser,uaOs:e.os,userAgent:e.userAgent,browserVersion:e.browserVersion}}getUserAgentInfo(){return(0,xu.default)(()=>this.driver.getUserAgentInfo(),{retries:3})}}});var Au,Ai,Cg=T(()=>{"use strict";Au=E(require("p-retry")),Ai=class{constructor(e,t,s={takeScreenshots:!0}){this.tabId=e,this.driver=t,this.options=s}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,s=this.currentDevicePixelRatio?Promise.resolve(this.currentDevicePixelRatio):this.getDevicePixelRatio(),n=()=>Promise.all([s,this.driver.takeScreenshot()]),[o,i]=await(0,Au.default)(n,{retries:e,minTimeout:t}),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,s=2e3,n=this.currentDevicePixelRatio?Promise.resolve(this.currentDevicePixelRatio):this.getDevicePixelRatio(),o=()=>Promise.all([n,this.driver.takeElementScreenshot(e)]),[i,a]=await(0,Au.default)(o,{retries:t,minTimeout:s}),c=a||"";return{image:`data:image/png;base64,${this.base64AddPadding(c.replace(/[\r\n]/g,""))}`,devicePixelRatio:i}}getDevicePixelRatio(){function e(){try{return window.devicePixelRatio}catch{return 1}}return this.driver.executeJS(e).then(t=>t.value)}forcePixelRatio(e=1){return this.currentDevicePixelRatio=e,Promise.resolve()}getCurrentDevicePixelRatio(){return this.currentDevicePixelRatio}}});async function kg(r,e){let t=e.image||e,s=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=r.offset||{top:0,left:0};if(o.top*=s,o.left*=s,!r.elementRect)return RE.warn("missing elementRect",Og.omit(r,"image")),{};let{elementRect:i}=r,a=await Ps.default.read(Buffer.from(n[1],"base64")),c=i.left*s+o.left*s,l=i.top*s+o.top*s,d=i.width*s,m=i.height*s;c<0&&(d+=c,d=d<0?0:d,c=0),l<0&&(m+=l,m=m<0?0:m,l=0);let p=a.bitmap.width,f=a.bitmap.height;if(c+d>p&&(d=p-c),l+m>f&&(m=f-l),m<=0||d<=0)throw new _n("height or width is equal or lower than zero");return{elementImage:await a.crop(c,l,d,m).getBase64Async(Ps.default.MIME_PNG)}}async function IE(r,e){let t=await Ps.default.read(r.width,r.height);for(let n of e){let o=n.image.match(/^data\:[^;]*\;base64,(.*)$/),i=await Ps.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(Ps.default.MIME_PNG)}function xE(r,e){return IE(r,e)}function PE(){return Promise.resolve()}function AE(r){function e(s){return typeof r[s]=="string"&&r[s].startsWith("data")}function t(s){return PE(r[s]).then(n=>({key:s,url:n}))}return Promise.all(Object.keys(r).filter(e).map(t)).then(s=>s.reduce((n,o)=>(n[o.key]=o.url,n),r))}function _g(r,e){return e=e||1,r=r||{left:0,top:0,width:0,height:0},{left:e*Math.round(r.left),top:e*Math.round(r.top),width:e*Math.round(r.width),height:e*Math.round(r.height),pixelRatio:e}}var Og,Ps,RE,_n,Ci,Lg=T(()=>{"use strict";Og=E(require("lodash"));U();Ps=E(require("jimp"));j();RE=R("image-capture-utils"),_n=class extends Error{constructor(e){super(e),this.rectIsOutsideOfImageError=!0,Object.setPrototypeOf(this,_n.prototype)}};Ci=class{constructor(e,t,s){this.windowUtils=t,this.screenshotUtils=s}async takeViewPortImage(){let e=await this.screenshotUtils.takeScreenshot();return typeof e=="string"?e:e.image}takeImageForComparison(){return this.takeViewPortImage()}async takeAreaDataUrl(e){e.areas&&(e=e.areas);let t=await this.screenshotUtils.takeScreenshot(),s=await kg(e,t);return s.screenImage=t.image,s.absoluteScreenHighlight=_g(e.elementRect,t.devicePixelRatio),s}async takeElementImage(e){let t=await this.screenshotUtils.takeElementScreenshot({ELEMENT:e});return{elementImage:typeof t=="string"?t:t.image}}async takeArea(e){e.areas&&(e=e.areas);let t=await this.screenshotUtils.takeScreenshot();return AE({screenImage:t.image,absoluteScreenHighlight:_g(e.elementRect,t.devicePixelRatio)})}forcePixelRatio(e){return this.screenshotUtils.forcePixelRatio(e)}getCurrentDevicePixelRatio(){return this.screenshotUtils.getCurrentDevicePixelRatio()}async takeStitchedDataUrl(e){let{windowUtils:t,screenshotUtils:s}=this,n=()=>se(250),o=Boolean(e);async function i(p,f){o?await t.scrollToPositionWithoutAnimation(p):await t.scrollToPosition(p),await n();let g=await s.takeScreenshot(),h=await kg({elementRect:f},g);return{position:{left:p.x+f.left,top:p.y+f.top},size:{width:f.width,height:f.height},image:h.elementImage}}async function a(p){let f=[];for(let g of p){let h=await i(g.scrollPos,g.cropData);f.push(h)}return f}function c(p,f){let g=Math.max(p.width,f.width),h=f.width,y=Math.max(p.height,f.height),w=f.height,A=Array.from({length:Math.ceil(g/h)},(v,x)=>({scrollX:Math.min(x*h,g-h),cropX:x*h-Math.min(x*h,g-h),cropW:h-(x*h-Math.min(x*h,g-h))})),b=Array.from({length:Math.ceil(y/w)},(v,x)=>({scrollY:Math.min(x*w,y-w),cropY:x*w-Math.min(x*w,y-w),cropH:w-(x*w-Math.min(x*w,y-w))}));return A.flatMap(v=>b.map(x=>({scrollPos:{x:v.scrollX,y:x.scrollY},cropData:{top:x.cropY,left:v.cropX,width:v.cropW,height:x.cropH}})))}async function l(p,f){let g=await t.getCurrentScrollPosition(),h=c(p,f),y=await a(h);return await t.scrollToPosition(g),xE(p,y)}let[d,m]=await Promise.all([t.getFullPageSize(),t.getViewportSize()]);return await l(d,m)}}});var Ng,ki,_i,Dg=T(()=>{"use strict";Ng=E(require("semver"));U();j();Pu();Cg();Lg();Ee();ki=R("tab-service"),_i=class{constructor(e){this.driver=e,this._utils={},this.sessionTabs={},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(s=>!t[s].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]={tabCount:0,tabInfos:{}})}setAddFrameHandlerCallBack(e){this.addFrameHandler=e}getAllTabInfoStrings(e){return this.getAllTabIds(e).map(s=>{let n=this.getTabInfo(e,s);return`tabId=${s}, 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}addNewTab(e,t,s,n={}){return this.addedTabs[e].has(t)?Promise.resolve():(this.addedTabs[e].add(t),ki.info(`Adding a new tab sessionId: ${e}, tabId: ${t}, openerId: ${s}`),this.addTab(e,t,this.sessionTabs[e].tabCount++,s,n))}addOpenerStepId(e,t,s){this.sessionTabs[e].tabInfos[t].openerStepId=s}addOpenerStep(e,t,s){this.sessionTabs[e].tabInfos[t].openerStepId=s.id,this.sessionTabs[e].tabInfos[t].openerOriginalStepId=s.originalStepId}fixMissingMainTab(e){if(this.getMainTabInfo(e))return;let s=this.getAllTabInfos(e);Object.keys(s).length!==0&&(Object.values(this.getAllTabInfos(e))[0].isMain=!0)}async buildTabInfo(e,t,s,n,o={}){let i=await this.getTabDetails(t,e,o),a=z();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:s,from:this.getTabInfo(e,i.openerTabId),isMain:c(this),openerStepId:n},a}async addTab(e,t,s,n,o={}){let i=await this.buildTabInfo(e,t,s,n,o),a=new xs(t,this.driver);this._utils[i]={attachDebugger:()=>Promise.resolve(),detachDebugger:()=>Promise.resolve(),onDebuggerDetached:()=>{},tabId:t,domUtils:{getDOM:()=>Promise.resolve()},windowUtils:a,imageCaptureUtils:new Ci(t,a,new Ai(t,this.driver,{takeScreenshots:o.takeScreenshots}))}}getTabUtilsByTabIdAndSessionId(e,t){let s=this.sessionTabs[e].tabInfos[t];return this._utils[s.infoId]}getTabUtilsByTabId(e){let t=Object.keys(this._utils).find(s=>this._utils[s].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 s=this.getAllTabInfos(e),n=Object.keys(s).map(i=>s[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,s){let n=s.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,s,n){let{urlUtils:o}=re(),i=o.urlBreaker(e.url||e.currentUrl),a=o.urlBreaker(t.url||t.currentUrl),c=n(i),l=n(a),d=s.map(m=>o.urlBreaker(m)).map(m=>n(m)).filter(m=>m===c);return c===l&&d.length===1}isSameTab(e,t,s){let{tabMatcher:n}=re();if(n){let l=this.getAllTabInfos(e),d=Object.keys(l).map(m=>l[m]);return n.isSameTab(d,t,s)}if(t.isMain&&s.isMain||t.openerStepId&&s.openerStepId&&t.openerStepId===s.openerStepId)return!0;let o=this.getAllTabInfos(e),i=Object.keys(o).map(l=>o[l].url);if(this.exactUrlMatch(t,s,i))return!0;let a=l=>`${l.domain}/${l.path.join("/")}`;if(this.singleExactMatchForParts(t,s,i,a))return!0;let c=l=>`${l.domain}/${l.path.join("/")}#${l.hash}`;return!!(this.singleExactMatchForParts(t,s,i,c)||t.order===s.order)}getMainTabInfo(e){let t=this.getAllTabInfos(e);return Object.keys(t).map(s=>t[s]).find(s=>s.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(s=>t[s].isMain)}isMainTabExists(e){return this.getMainTabId(e)?Promise.resolve(!0):Promise.resolve(!1)}clearAllTabs(e){let t=this.getAllTabInfos(e);this.sessionTabs[e].tabCount=0,Object.keys(t).forEach(s=>this.removeTabInfo(e,s))}clearNonMainTabs(e){let t=this.getAllTabInfos(e);Object.keys(t).filter(s=>!t[s].isMain).forEach(s=>this.removeTabInfo(e,s)),this.sessionTabs[e].tabCount=1}switchTab(e,t,{forceSwitch:s=!1}={}){let n=this.sessionTabs[t]?this.sessionTabs[t].tabCount:1;return typeof n=="number"&&n>1||s?this.driver.switchTab(e):Promise.resolve()}getTabDetails(e,t,s={}){return this.switchTab(e,t,s).then(()=>{if(s.skipLoadInfo)return{title:"",url:""};let n=Promise.resolve("unknown");return s.checkForMainTab&&(n=this.driver.executeJS("return window.__isMainTestimTab").then(o=>o.value)),Promise.all([this.driver.getTitle(),this.driver.getUrl(),n]).then(([o,i,a])=>({title:o,url:i,isMainTab:a}),o=>(ki.error("failed to get url or title",{err:o}),{title:"",url:""}))}).catch(n=>{ki.error("failed to switch to tab",{tabId:e,err:n})})}async getUnregisteredTabId(e){return(await this.driver.getTabIds()).find(s=>!this.getAllTabIds(e).includes(s))}async waitForTabToOpen(e){let t=await this.getUnregisteredTabId(e);return t||(await se(500),await this.waitForTabToOpen(e))}async tryToAddTab(e,t){if(this.pendingTabs[e])return;let s=await this.getUnregisteredTabId(e);s&&(await this.addNewTab(e,s),await this.addFrameHandler(s),this.sessionTabs[e].currentTab=null)}addNewPopup(e,t){let s=this.getAllTabInfos(e);return Object.keys(s).find(o=>s[o].openerStepId===t)?Promise.resolve():this.pendingTabs[e]?(ki.info(`overriding opener step id from ${this.pendingTabs[e]} to ${t}`),this.pendingTabs[e]=t,Promise.resolve()):(this.pendingTabs[e]=t,this.waitForTabToOpen(e).then(o=>this.addNewTab(e,o,this.pendingTabs[e]).then(()=>this.addFrameHandler(o)).then(()=>delete this.pendingTabs[e]).then(()=>this.sessionTabs[e].currentTab=null)))}waitToPendingTabs(e,t){let n=3e3,o=this;return t?new Promise(i=>{function a(){o.pendingTabs[e]===t&&n-500>0?(n-=500,setTimeout(a,500)):i()}a()}):Promise.resolve()}isMainTabIncognito(){return Promise.resolve(!1)}isInvalidStepVersion(e){let t=Ng.lt(e._version||e.version,"1.2.0"),s=!!e.parameterValues,n=s&&e.parameterValues.some(o=>o.type==="locate"&&!o.frameLocators);return t&&(!s||n)}getTabIdByTabInfo(e,t){var i,a;let{tabMatcher:s,commonConstants:n}=re();if(this.isInvalidStepVersion(t))return Promise.reject({success:!1,shouldRetry:!1,errorType:n.stepResult.INVALID_TEST_VERSION});if((i=t.useCurrentTab)!=null&&i.call(t))return this.driver.getCurrentTabId().then(c=>{if(c)return c;let l=this.getMainTabId(e);if(l)return l;throw new Error("Current tab not found")});let o=(a=t.tabInfo)==null?void 0:a.openerStepId;return this.waitToPendingTabs(e,o).then(()=>{let c;if(s){let l=this.getAllTabIds(e).map(d=>Object.assign({},this.getTabInfo(e,d),{tabId:d})).filter(d=>!d.isClosed);c=s.matchTabs(t,l)}else{let l=t.tabInfo;l?c=this.getAllTabIds(e).find(d=>{let m=this.getTabInfo(e,d);return this.isSameTab(e,m,l)}):c=this.getMainTabId(e)}return c?this.sessionTabs[e].currentTab===c?c:this.switchTab(c,e).then(()=>(this.sessionTabs[e].currentTab=c,c)).catch(l=>{let d=["no such window","no window found","the window could not be found"];if(l.message&&d.some(m=>l.message.toLowerCase().includes(m)))return this.sessionTabs[e].tabCount--,this.sessionTabs[e].tabInfos[c].isClosed=!0,this.getTabIdByTabInfo(e,t);throw l}):this.tryToAddTab(e,o).then(()=>{throw new Error("No tab ID found")})})}}});var Cu,Oi,ku=T(()=>{"use strict";Cu=class{constructor(){}select(){return console.log(`
370
370
  internal error - cant use port selector in selenium!!!!
371
371
  `),Promise.reject({reason:"cant use port selector in selenium!"})}prepare(){}handleLegacyDataCaching(){}},Oi=new Cu});var As,_u=T(()=>{"use strict";Iu();Ee();As=class{constructor(e,t){this.driver=e,this._abortedSteps=[],this.cookieUtils=t||new Is(this.driver)}get sessionPlayerInit(){return re()}getTimeStamp(){return Date.now()}getTestimId(e){if(!e)return;let{locatorBuilderUtils:t}=this.sessionPlayerInit,s=t.TESTIM_ID_FIELD_NAME;return t.isEmptyResult(e)?t.EMPTY_RESULT_ID:e.getAttribute(s)}resetAbort(){this._abortedSteps=[]}abort(e){this._abortedSteps.push(e)}get abortedSteps(){return this._abortedSteps}restoreNativeAlerts(){}executeOverloadNativeAlertsInFrame(){}getClickOffset(e,t){let{utils:s}=this.sessionPlayerInit;return e&&s.isWithinBounds(0,t.width,e.x)&&s.isWithinBounds(0,t.height,e.y)?{xOffset:e.x,yOffset:e.y}:{xOffset:t.width/2,yOffset:t.height/2}}executeInAut(e,t){return this.driver.executeJS(t).then(s=>s.value)}extractTargetText(e){return this.driver.getTargetText(e)}extractText(e){return this.driver.getElementTextJS(e)}async markDynamicParent(e,t,s){return this.driver.markDynamicParent(e,t,s)}getCookie(e){return this.cookieUtils.get({name:e})}setCookie(e,t){return this.cookieUtils.set(e)}getNextDynamicParent(e,t){let s=`return ${this.sessionPlayerInit.codeSnippets.getNextDynamicParent(t)}`;return this.driver.executeJS(s).then(n=>n.value)}}});function Fg(r){class e{constructor(s,n){this.frameManager=s,this.locateElementPlayer=n,this._cache={}}cacheResults(s,n){this._cache[s]=n}getResultsFromCache(s){return this._cache[s]}cacheFrameLocateResults(s){if(s!=null&&s.seleniumFrameElement&&s.frameLocateResultUrl){let n=Mg(s.seleniumFrameElement);n&&this.cacheResults(n,s.frameLocateResultUrl)}}async foundFrameCallback(s,n,o){let{frameOffset:i,locatedElement:a}=s,{locatorBuilderUtils:c}=re();if(c.isEmptyResult(a)){let p="got empty result in frame result, not rejected from locate element player";throw CE.error(p),new Error(p)}let l=await r.switchToLocatedFrame(a),d=Mg(l.value),m=this.getResultsFromCache(d);return{frameId:-1,frameOffset:i,tabInfo:n.tabInfo,tabId:n.tabId,testimFrameId:o,testimFullFrameId:`${this.currentFrameHandler.testimFullFrameId}-${o}`,seleniumFrameElement:l.value,frameLocateResultUrl:m}}locate(s,n,o,i,a,c){let l=new this.locateElementPlayer(i);return s.targetId=`frameLocator_${n}`,l.locate(s,o,s.targetId).then(d=>(d.isVisible=!0,l.handleLocateResult(d,c,s).catch(()=>{throw new Error}))).then(d=>{let{locatedElement:m}=i.data[s.targetId];return r.getElementLocationWithPadding(m).then(p=>{let f=p.value||{top:0,left:0};return d.frameOffset={top:o.frameOffset.top+f.top,left:o.frameOffset.left+f.left},d})}).then(d=>(l.addFrameDataToContext&&l.addFrameDataToContext(d.targetId,d.locateResult),this.foundFrameCallback(d,a,s.testimFrameId))).then(d=>(this.currentFrameHandler=d,d))}async findFrame(s,n,o,i){let a=M.flags.enableFrameSwitchOptimization.isEnabled(),l=o.playback.resultsHandler.resultsByChronologicOrder.at(-1),d=1,m=Boolean(l)&&l.stepId===s.id&&l.results.length>d;if(a&&!m&&this.currentFrameHandler){let y=n.findIndex(w=>w.testimFrameId===this.currentFrameHandler.testimFrameId);if(y>-1){let w=n.slice(y+1),A=0;for(let b of w)A++,this.currentFrameHandler=await this.locate(b,A,this.currentFrameHandler,o,i,s);return this.currentFrameHandler}}let p=await i.getTopFrameHandler();p.frameOffset={top:0,left:0},await(a&&this.currentFrameHandler===p?this.currentFrameHandler:r.switchToTopFrame()),this.cacheFrameLocateResults(this.currentFrameHandler),this.currentFrameHandler=p;let g=0,h=p;for(let y of n)g++,h=await this.locate(y,g,h,o,i,s);return h}}return e}var CE,kE,_E,Mg,Ug=T(()=>{"use strict";j();ye();Ee();CE=R("frame-locator"),kE="ELEMENT",_E="element-6066-11e4-a52e-4f735466cecf",Mg=r=>r?r[kE]||r[_E]:null});var Li,Ou=T(()=>{"use strict";le();Li=()=>{try{if(Bd)return!1;if(require("inspector").url())return!0}catch{}return!1}});var Lu,jg,Ur,OE,Nu,We,On=T(()=>{"use strict";U();It();Lu=E(require("ws")),jg=require("events");j();le();Ur=R("socket-ng-service"),OE=5e3,Nu=class extends jg.EventEmitter{constructor(){super(...arguments);this.clientId=z();this.ws=null;this.filterMap={};this.listeners={}}onReconnect(t){Ur.info("test result websocket re-connect"),setTimeout(()=>this.connect(t),OE)}formatUrl(t){return t.startsWith("http://")?t.replace("http://","ws://"):t.startsWith("https://")?t.replace("https://","wss://"):t}parseEvent(t){try{return JSON.parse(t)}catch(s){Ur.error("failed to parse or trigger event",{err:s})}}connect(t){let s=this.formatUrl($d);return Jt().then(n=>new Promise(o=>{let i={...global.proxyUri&&{agent:new global.ProxyAgent(global.proxyUri)}};this.ws=new Lu.default(`${s}?projectId=${t}&clientId=${this.clientId}&token=${n}`,i),this.ws.on("open",()=>{var a;return Ur.info("websocket opened"),this.reSendAllExistingFilters(),(a=this.onConnect)==null||a.call(this),o()}),this.ws.on("close",a=>{Ur.info("websocket closed",{event:a}),(!this.ws||this.ws.readyState===Lu.default.CLOSED)&&this.onReconnect(t)}),this.ws.on("error",a=>{Ur.info("websocket error",{event:a})}),this.ws.on("message",a=>{let c=this.parseEvent(a);c!=null&&c.type&&this.emit(c.type,c.data)})}))}sendMessage(t){if(!this.ws){Ur.warn("tried to send error when websocket was disconnected");return}try{this.ws.send(JSON.stringify(t))}catch(s){Ur.error("failed to stringify message for sending",{err:s})}}listenOnce(t,s,n){let o=i=>{s(i)&&(n(i),this.removeListener(t,o))};this.on(t,o)}listenTo(t,s,n,o){function i(c){n(c)&&o(c)}(Array.isArray(s)?s:[s]).forEach(c=>{var d,m;(d=this.listeners)[m=`${t}:${c}`]||(d[m]=[]);let l=i.bind(this);this.listeners[`${t}:${c}`].push(l),this.on(c,l)})}reSendAllExistingFilters(){Object.keys(this.filterMap).forEach(t=>{let s=this.filterMap[t];this.sendMessage({type:"add-filter",filter:s})})}addFilter(t,s,n,o=!1){return new Promise(i=>{let a=z(),c={query:s,id:a,type:n,fullDocument:o};this.listenOnce("add-filter:done",l=>l.id===a,i),this.sendMessage({type:"add-filter",filter:c}),this.filterMap[t]=c})}removeListeners(t,s){Object.keys(this.listeners).length!==0&&s.forEach(n=>{let o=this.listeners[`${t}:${n}`];o&&(delete this.listeners[`${t}:${n}`],o.forEach(i=>this.removeListener(n,i)))})}removeFilter(t,s){let n=this.filterMap[t];if(!n)return;let o=Array.isArray(s)?s:[s];this.removeListeners(t,o),delete this.filterMap[t],this.sendMessage({type:"remove-filter",filter:n})}},We=new Nu});var $g,Du,LE,NE,DE,Bg,Ni,ir,Di=T(()=>{"use strict";$g=E(require("p-retry")),Du=E(require("socket.io-client"));le();U();j();LE=50,NE=10,DE=5e3,Bg=10*1e3,Ni=R("base socket service"),ir=class{constructor(){this.attempts=0;this.rooms={};this.emitPromiseQueue=void 0}joinToMultipleResults(){let e=Object.keys(this.rooms);Ni.info("re-join all existing rooms",{testResultIds:e}),e.forEach(t=>{var n;let s=this.rooms[t];(n=this.emitJoinRoom)==null||n.call(this,t,s)})}joinRoom(e,t){this.rooms[e]=t}leaveRoom(e){delete this.rooms[e]}addSocketHandlers(){let e=(t,s)=>{let n="websocket";try{n=this._socket.io.engine.transport.name}catch{}Ni.error(`Error in SocketService websocket _${t}_ socket ${this._socket.id} is ${this.url} over ${n}. Reconnect attempts ${this.attempts}. Error is: ${s==null?void 0:s.message}`)};this._socket.on("reconnect_attempt",t=>{if(e("reconnect_attempt",{message:"reconnect attempt",attempt:t}),this.attempts++,this.attempts===NE&&!this.isAllowedWS&&(this._socket.io.opts.transports=["polling"],this._socket.io.opts.upgrade=!1),this.attempts>=LE)throw new Error(`Can't connect to Testim Servers.
372
372
  Action required: Please allow opening a websockets connection to ${he} in your firewall/proxy`)}),this._socket.on("connect_error",t=>{e("connect_error",t)}),this._socket.on("connect_timeout",t=>{e("connect_timeout",t)}),this._socket.on("error",t=>{e("error",t)}),this._socket.on("reconnect_error",t=>{this.prevErr&&this.prevErr.type===t.type||(this.prevErr=t,e("reconnect_error",t))}),this._socket.on("reconnect",()=>{Ni.info("reconnect to socket and re-join to rooms"),this.joinToMultipleResults()}),this._socket.on("connect",()=>{var t;this.attempts=0,this.isAllowedWS===void 0&&(this.isAllowedWS=this._socket.io.engine.transport&&this._socket.io.engine.transport.name==="websocket"),(t=this.onConnect)==null||t.call(this)})}initNewSocket(e,t){let s={query:{projectId:e},requestTimeout:Bg,transports:["websocket"],upgrade:!1,forceNew:!0,rejectUnauthorized:process.env.NODE_TLS_REJECT_UNAUTHORIZED!=="0",...global.caFileContent&&{ca:global.caFileContent},...global.proxyUri&&{agent:new global.ProxyAgent(global.proxyUri)}};return new Promise(n=>{this.url=`${he}/${t}`,this._socket=Du.connect(this.url,s),this.addSocketHandlers(),this._socket.on("connect",n),this._socket.open()})}init(e,t){let s={query:{projectId:e},requestTimeout:Bg,transports:["websocket"],upgrade:!1,rejectUnauthorized:process.env.NODE_TLS_REJECT_UNAUTHORIZED!=="0",...global.caFileContent&&{ca:global.caFileContent},...global.proxyUri&&{agent:new global.ProxyAgent(global.proxyUri)}};this.url=`${he}/${t}`,this._socket=Du.connect(this.url,s),this.addSocketHandlers()}emitPromise(e,t){let s={},n=()=>new Promise((o,i)=>{this._socket.emit(e,t,a=>a!=null&&a.success?o():(s[e]=t,i(new Error("bad ack"))))});return this.emitPromiseQueue=(this.emitPromiseQueue||Promise.resolve()).then(()=>(0,$g.default)(()=>te(n(),DE),{retries:200,minTimeout:3e3,factor:1})).finally(()=>{Object.keys(s).length>0&&Ni.error("Bad acknowledge from socket emit",{errorneousEvents:s})}),this.emitPromiseQueue}}});var Mu,jr,Wg=T(()=>{"use strict";Di();Mu=class extends ir{constructor(){super(...arguments);this.listerers={}}init(t){super.init(t,"testResult"),this.listerers={}}listenToTestResult(t,s,n){this.listerers[t]&&(this._socket.off("testResult:updated",this.listerers[t]),delete this.listerers[t]),this.listerers[t]=o=>{o.resultId===t&&o.testId===s&&n(o.testResult)},this._socket.on("testResult:updated",this.listerers[t])}emitJoinRoom(t,s){return this.emitPromise("testResult:join",{resultId:t,testId:s})}async joinToTestResult(t,s){this.rooms[t]||(this.joinRoom(t,s),await this.emitJoinRoom(t,s))}emitLeaveRoom(t,s){return this.emitPromise("testResult:leave",{resultId:t,testId:s})}leaveTestResult(t,s){return this.listerers[t]?(this.leaveRoom(t),this._socket.off("testResult:updated",this.listerers[t]),delete this.listerers[t],this.emitLeaveRoom(t,s)):Promise.resolve()}getSocket(){return this._socket}},jr=new Mu});var Vg={};W(Vg,{testResultService:()=>Qe});var Gg,Fu,Qe,Cs=T(()=>{"use strict";Gg=require("events");On();ae();ye();Wg();Fu=class extends Gg.EventEmitter{init(e){if(M.flags.useNewWSCLI.isEnabled()){We.onConnect=()=>this.emit("socket-connected");return}jr.init(e),jr.onConnect=()=>this.emit("socket-connected")}joinToTestResult(e,t){return M.flags.useNewWSCLI.isEnabled()?We.addFilter(`${e}:testResult`,{resultId:e,testId:t},[rt.TEST_RESULT_UPDATED,rt.TEST_RESULT_CREATED]):jr.joinToTestResult(e,t)}async leaveTestResult(e,t){if(M.flags.useNewWSCLI.isEnabled()){We.removeFilter(`${e}:testResult`,[rt.TEST_RESULT_UPDATED,rt.TEST_RESULT_CREATED]);return}await jr.leaveTestResult(e,t)}listenToTestResult(e,t,s){if(M.flags.useNewWSCLI.isEnabled()){We.listenTo(`${e}:testResult`,[rt.TEST_RESULT_UPDATED,rt.TEST_RESULT_CREATED],n=>n.resultId===e&&n.testId===t,n=>s(n));return}jr.listenToTestResult(e,t,s)}getSocket(){if(!M.flags.useNewWSCLI.isEnabled())return jr.getSocket()}},Qe=new Fu});var $,ce=T(()=>{"use strict";Ee();$=class{constructor(e,t,s,n={},o=void 0,i=void 0,a={}){this.step=e,this.context=t,this.frameHandler=s,this.frameId=0,this.stepActionUtils=o,this.locateElementPlayer=i,this.exportsGlobal=n,this.exportsTest=a}get driver(){return this.stepActionUtils.driver}get sessionPlayerInit(){return re()}async performAction(){throw new Error("not implemented")}getTarget(){let e=this.step.targetId||"targetId";return this.context.data[e]}async execute(e,t){var s;try{return{success:!0,...await this.performAction(e,t)}}catch(n){let o=(n==null?void 0:n.message)||((s=n==null?void 0:n.seleniumStack)==null?void 0:s.message),i=n==null?void 0:n.displayMessage;return{success:!1,reason:o,exception:n,errorType:this.sessionPlayerInit.commonConstants.stepResult.ACTION_EXCEPTION,resultInfo:{exception:`selenium exception: ${o}`,error:i||o}}}}}});function UE(){let r=t=>Math.round(t/1024/1024*100)/100,e=process.memoryUsage();return{isOverThreshold:r(e.rss)>FE,rss:`${r(e.rss)} MB -> Resident Set Size - total memory allocated for the process execution`,heapTotal:`${r(e.heapTotal)} MB -> total size of the allocated heap`,heapUsed:`${r(e.heapUsed)} MB -> actual memory used during the execution`,external:`${r(e.external)} MB -> V8 external memory`}}function jE(r,e,t){let s=UE();s.isOverThreshold&&ar.info(`using ${r} to parse html`,{memoryUsage:s,testName:e,testResultId:t})}function BE(r){return{getFrameIdByTestimFrameId(){},async setElementResultDataOnContext(e){let t=await r.getElement(e.locatedElement);e.seleniumElement=t.value},getElementRectangle(e){return r.getElementRect(e)},getOffsets(e){return Promise.resolve([e.frameOffset||{}])},getOptimizedDom(e){let s=new qg.DOMParser().parseFromString("<html><body></body></html>","text/html");return s.body.outerHTML=e,Object.assign(s,{parsedUsingLinkedom:!0})},htmlStringToDom(e,t,s,n,o=!1){jE(o?"linkedom":"jsdom",r.testName,r.testResultId);let i;if(o)i=this.getOptimizedDom(e);else{let a=new Mi.VirtualConsole;i=new Mi.JSDOM(e,{virtualConsole:a}).window.document}return Object.assign(i,{TESTIM_URL:t})},shouldUseNativeVisibilityCheck(e,t,s,n){return e.opacity===0||e.isShadowed?!1:s===void 0||n===void 0?!0:M.flags.useClickimVisibilityChecks.isEnabled()?!1:t.isSafari()?M.flags.useSafariWebdriverVisibilityChecks.isEnabled():!0},async isVisible(e,t,s,n,o,i,a){let{locatorBuilderUtils:c,codeSnippets:l,visibilityUtils:d,positionUtils:m}=re();if(this.shouldUseNativeVisibilityCheck(n,r,d,m))return r.isVisible(e.seleniumElement);if(!e.seleniumElement)return{visible:!1,invisibleReason:"element not found"};try{await r.isVisible(e.seleniumElement)}catch{}if(!t||c.isEmptyResult(t))return{visible:!1,invisibleReason:"element not found"};let g=[m.calculateElementMiddlePoint(s),m.calculateClickPoint(n.clickOffset,s)].filter(Boolean),h=l.getVisibilityCode.getCompoundVisibilityInfoCode(e.locatedElement,g,!1,n),y;try{y=await r.execute(`return ${h}`)}catch(x){throw ar.error("failed to execute getVisibilityCode",{err:x}),x}let{value:w}=y||{},A=w.elementVisibilityInfo||ME,[b,v]=w.elementsFromPointResults||[null,null];return d.checkElementVisibility(A,n,v,b,a,t)},scrollToElement(e,t){let{codeSnippets:s}=re(),n=s.scrollToElement;return r.execute(n(t))}}}var Mi,qg,ar,ME,FE,Ln,Hg=T(()=>{"use strict";Mi=require("jsdom");ce();j();ye();Ee();qg=require("linkedom"),ar=R("locate-step-action"),ME={opacity:1,clientRects:{}},FE=4e3;Ln=class extends ${execute(){return this.driver.getHTML(this.step)}static getUtils(e){return Object.assign(BE(e),{useLocatedElement:!0})}static getFrameIdByTestimFrameId(...e){throw ar.warn("Unplanned access to getFrameIdByTestimFrameId()"),new Error("Use .getUtils() instead")}static setElementResultDataOnContext(...e){throw ar.warn("Unplanned access to setElementResultDataOnContext()"),new Error("Use .getUtils() instead")}static getElementRectangle(...e){throw ar.warn("Unplanned access to getElementRectangle()"),new Error("Use .getUtils() instead")}static getOffsets(...e){throw ar.warn("Unplanned access to getOffsets()"),new Error("Use .getUtils() instead")}static htmlStringToDom(...e){throw ar.warn("Unplanned access to htmlStringToDom()"),new Error("Use .getUtils() instead")}static isVisible(...e){throw ar.warn("Unplanned access to isVisible()"),new Error("Use .getUtils() instead")}}});var zg,Kg=T(()=>{"use strict";zg=function(r,e,t,s,n,o,i,a){function c(w,A){if(!A)return{success:!1};elementScrollTo(A,w.x,w.y);let b=A.scrollLeft,v=A.scrollTop;return{success:Math.abs(v-w.y)<1&&Math.abs(b-w.x)<1,actualX:b,actualY:v}}function l(w,A,b,v,x,k,D){if(!b)return{x:v,y:x};let S=getLocatedElement(A);if(s&&!S)return{x:w.scrollWidth,y:w.scrollHeight};if(!S)throw new Error("could not find target element");let O=S.getBoundingClientRect(),P=0,N=0,B=Math.max(window.innerHeight-(O.height+10),0),V=Math.max(window.innerWidth-(O.width+10),0);return P=D?w.scrollTop+O.top-Math.min(x,B):w.scrollTop,N=k?w.scrollLeft+O.left-Math.min(v,V):w.scrollLeft,{x:Math.round(N),y:Math.round(P)}}let d=!r;if(r=d?document.scrollingElement||document.documentElement:getLocatedElement(r),!r)throw new Error("could not find target to scroll on");let m={top:r.scrollTop,left:r.scrollLeft},p=l(r,e,t,n,o,i,a),f=c(p,r);d&&!document.scrollingElement&&!f.success&&m.top===r.scrollTop&&m.left===r.scrollLeft&&(r=document.body,p=l(r,e,t,n,o,i,a),f=c(p,r));let g=f.actualX,h=f.actualY,y=getLocatedElement(e);if(t&&s&&!y)return{success:!1,expectedPosition:p};if(t){if(!y)throw new Error("could not find target to scroll to");let w=y.getBoundingClientRect();g=w.left,h=w.top}return{success:f.success,actualX:g,actualY:h}}});var Fi,Jg=T(()=>{"use strict";Kg();ce();Fi=class extends ${getFailureString(e,t,s,n,o){if(!e.isScrollToElement)return`Scrolling limit reached. Expected:(y: ${s}, x: ${t}); Actual:(y:${o}, x: ${n})`;let i="Scrolling limit reached";return e.shouldScrollTop&&(i+=`. Expected top margin: ${s}, actual: ${o}`),e.shouldScrollLeft&&(i+=`. Expected left margin: ${t}, actual: ${n}`),i}async scroll(e,t,s){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,m,p){d.scrollTo(m,p)}:function(d,m,p){d.scrollTop=p,d.scrollLeft=m},l=`